SkillAgentSearch skills...

42libft

Ecole 42 libft projesi icin notlarim ve dosyalarim.

Install / Use

/learn @emreakdik/42libft
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Zorunlu Kisim

  • Zorunlu kisimin bize temel beceri ve bilgi konusunda gelistirmeye calistigini dusunuyorum. Cunku libft'yi iyi sekilde anlamaya calismak ve hizli gecmemek siradaki projeleri anlamamda cok isime yaradi.
  • Asagidaki notlar projeyi tamamlarken merak ettigim ve cevabini aradigim sorulardan olusuyor. Butunuyle libft vermenizi saglayacak notlar degil.

Bir char nasil bir integer'a donusturulur?

Diyelim ki elimizde '5' karakteri var. Bu karakteri integer'a donusturmek icin yapmamiz gereken tek sey '0' karakterinden cikartmaktir (bu cikartma isleminde karakterlerin decimal karsiliklari arasinda yapilmaktadir). Cikan sonuc ise integer olarak tutulabilmektedir ve bu bize istedigimiz integer sonucu vermektedir.

Ornek:

('5' - '0') => (53 - 48) => 5

Bu işlem, '0' karakteri ile istediğimiz rakam karakteri arasındaki farkı bulmamıza olanak tanır ve sonuç olarak karakteri temsil eden sayısal değeri elde ederiz. Örneğin '9' karakteri için 53 - 48 = 5 olur ve bu şekilde '5' karakterini integer türüne dönüştürmüş oluruz.

Malloc Nedir ve Nasil Calisir?

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr;
    int size = 5;

    // 5 tane int türünde bellek alanı tahsisi yap
    ptr = (int *)malloc(size * sizeof(int));

    if (ptr == NULL) {
        printf("Bellek tahsisi yapilamadi.\n");
        return 1;
    }

    // Bellekte tahsis edilen alanı kullanabilirsiniz

    // Bellek alanını serbest birak
    free(ptr);

    return 0;
}

Yukarıdaki örnek, malloc() işlevini kullanarak 5 int veri türü için bellek alanı ayırır. Bellek alanı başarıyla tahsis edildikten sonra, bu alanı kullanabilirsiniz. Belleği kullanımınız tamamlandığında, free() işlevini kullanarak tahsis edilen bellek alanını serbest bırakmanız önemlidir. Bellek alanını serbest bırakmazsanız, programınız hafıza sızıntısı (memory leak) ile karşı karşıya kalabilir, yani tahsis edilen bellek alanınız program sonlanana kadar hafızada kalabilir.

Arkaplanda, malloc() işlevi çalışma zamanında işletim sistemi tarafından sağlanan bellek havuzundan uygun miktarda bellek alanı talep eder. Bu bellek havuzu, genellikle programın heap alanı olarak adlandırılan bellek bölgesinde yer alır. malloc() işlevi bu bellek havuzundan belirtilen boyut kadar bellek alanı talep eder ve bu alanın başlangıç adresini gösteren bir işaretçi döndürür. Eğer talep edilen bellek alanı mevcut değilse veya yeterli boş bellek yoksa, malloc() işlevi NULL işaretçisi döndürerek bellek tahsisi başarısız olduğunu belirtir.

Belleği kullanımınız tamamlandığında, free() işlevini kullanarak işaretçi ile gösterilen bellek alanını serbest bırakmanız gerekir. free() işlevi, bellek alanını programın heap alanında geri verir, böylece başka amaçlar için kullanılabilir hale gelir.

Isaretci/Adres Aritmetigi nedir? (dst + i)

Adres aritmetiği, işaretçi türü değişkenlerle gerçekleştirilir. İşaretçi, bellekte bir verinin yerini işaret eden bir değişkendir. Bellek adresi tamsayılar gibi düşünülebilir ve işaretçi bu adresleri saklayarak ve manipüle ederek bellek üzerinde gezinmeyi sağlar.

C dilinde adres aritmetiği için kullanılan bazı operatörler şunlardır:

  1. '&' (Ampersand) operatörü: Bu operatör, bir değişkenin bellek adresini elde etmek için kullanılır. Örneğin: int x = 10; int *ptr = &x; ptr, x'in bellek adresini tutar.

  2. '*' (Asterisk) operatörü: Bu operatör, bir işaretçinin gösterdiği adresteki değeri elde etmek için kullanılır. Örneğin: int value = *ptr; value, ptr'nin gösterdiği bellek adresindeki değeri alır.

  3. İşaretçi aritmetiği: İşaretçiler, tamsayılarla (integer) aritmetik işlemler gerçekleştirebilir. Bu işlemler, işaretçinin gösterdiği bellek adresini değiştirerek bellek üzerinde gezinmeyi sağlar. Örneğin: ptr++; işlemi, ptr'nin gösterdiği bellek adresini bir tamsayı büyütür, böylece bir sonraki bellek hücresine işaret eder.

  4. Dizi indeksleme: Diziler, bellekte ardışık hücrelerde depolanan veri koleksiyonlarıdır. Bir diziye işaretçi aritmetiği kullanarak erişilebilirsiniz. Örneğin: int arr[] = {1, 2, 3}; int *ptr = arr; ile ptr, dizinin ilk elemanının adresini tutar. ptr[1] ifadesi, ikinci elemana erişmeyi sağlar.

Örnek bir adres aritmetiği kullanımı:

int arr[] = {10, 20, 30, 40};
int *ptr = arr; // ptr, dizinin ilk elemanının adresini alır

// İkinci elemanin yazdirilamsi
printf("Ikinci eleman: %d\n", *(ptr + 1)); // 20

// Dördüncü elemanın yazdirilmasi
printf("Dorduncu eleman: %d\n", *(ptr + 3)); // 40` 

Adres aritmetiği, bellek üzerinde veri manipülasyonu ve veri yapılarının etkin bir şekilde kullanılmasını sağlar. Ancak, dikkatli kullanılmazsa hatalara ve güvenlik açıklarına yol açabileceği için dikkatli olmak önemlidir.

Isaretci aritmetiginde adres her zaman 1 mi artar?

Her hücre, genellikle bir byte veya daha büyük bir veri parçasını temsil eder. İşaretçi, işaret ettiği hücrenin veri türüne göre ilerler ve işaret ettiği hücrenin boyutuna göre adres aritmetiği yapar.

Işaretçi aritmetiği yaparken işaretçi, işaret ettiği bellek hücresinin boyutunu dikkate alır. Bu nedenle işaretçi bir tamsayı artışı yaparken, hafızada bir tam sayı değeri kadar öteler.

Örnek olarak, bir int tipinde işaretçi düşünelim. int genellikle 4 byte (32 bit) büyüklüğünde olduğunu varsayalım. Bu durumda işaretçi bir tam sayı artışı yaptığında, işaret ettiği bellek hücresinin adresi, 4 byte ilerleyecektir.

int arr[] = {10, 20, 30, 40};
int *ptr = arr;

ptr = ptr + 1;

printf("Ikinci eleman: %d\n", *ptr);

Burada ptr = ptr + 1; ifadesi, işaretçinin gösterdiği bellek adresini 4 byte (int'in boyutu) artırır. Sonuç olarak, ptr, artık dizinin ikinci elemanını işaret eder.

Str fonksiyonlar ile mem fonksiyonlar arasindaki fark nedir?

C dilinde, mem fonksiyonları ve str fonksiyonları, bellek manipülasyonu ve karakter dizisi (string) işlemleri için kullanılan iki farklı kategoride işlevlerdir. İşte bu iki fonksiyon kategorisi arasındaki farklar:

  1. mem Fonksiyonları:

    • mem fonksiyonları, bellek manipülasyonu için kullanılır. Bellek manipülasyonu, bellek bloklarını kopyalama, karşılaştırma ve doldurma gibi işlemleri içerir.
    • Bu fonksiyonlar, işaretçilerle çalışır ve genellikle bellek blokları üzerinde byte bazında işlem yaparlar.
    • memcpy, memmove, memcmp, memset gibi mem fonksiyonları bu kategoriye örnek olarak verilebilir.
    • Bellek işlemleri, karakter dizisi olmayan her türlü veri kopyalama, karşılaştırma veya işleme için kullanılabilir.
  2. str Fonksiyonları:

    • str fonksiyonları, karakter dizileri (string) ile çalışmak için kullanılır. Karakter dizileri, bir dizi karakterin sonlandırıcı karakter ('\0' veya NULL karakter) ile bitirildiği veri yapılarıdır.
    • Bu fonksiyonlar, karakter dizileri üzerinde işlem yapar ve sık kullanılan string manipülasyon işlemleri için optimize edilmiştir.
    • strcpy, strcmp, strlen, strcat gibi str fonksiyonları bu kategoriye örnek olarak verilebilir.
    • Karakter dizileri üzerinde yapılan işlemler, karakter dizilerinin sıfır ile sonlandırılmasına uygun şekilde gerçekleştirilir.

File Descriptor (fd) nedir?

"file descriptor" (dosya tanımlayıcısı), dosyalara veya diğer giriş/çıkış kaynaklarına erişmek için kullanılan bir tamsayı değeridir. Dosya tanımlayıcısı, işletim sistemi tarafından oluşturulan bir işaretçi gibidir,

Dosya tanımlayıcıları, işletim sisteminde açık olan her dosya için benzersiz bir numaralandırmaya sahiptir. Örneğin, UNIX ve Linux sistemlerinde, 0, 1 ve 2 numaralı dosya tanımlayıcıları özel olarak aşağıdaki şekilde atanır:

  • 0: Standart giriş (stdin) - Klavyeden okuma için kullanılır.
  • 1: Standart çıkış (stdout) - Ekran yazdırma için kullanılır.
  • 2: Standart hata (stderr) - Hata mesajlarını göndermek için kullanılır.

Ayrıca, 3 ve sonraki numaralar, açık olan diğer dosyalar için atanır. Bu dosya tanımlayıcıları, open() veya fopen() gibi dosya açma işlevleri kullanılarak elde edilir. Dosya tanımlayıcıları, int türünden değişkenlerde saklanır.

Fd icin open fonksiyonu nasil kullanilir?

Fonksiyonun prototipi şu şekildedir:

int open(const char *path, int flags, mode_t mode);` 

Burada, path parametresi açılacak dosyanın yolu ve adını içeren bir karakter dizisidir. flags parametresi açma modunu belirlemek için kullanılır ve hangi türde dosya erişimi yapılacağını belirtir. mode parametresi ise yeni bir dosya oluşturulduğunda izinlerin belirlenmesi için kullanılır (bu parametre sadece dosya oluşturulduğunda önemlidir).

open() işlevi, bir dosya tanımlayıcısı (file descriptor) döndürür. Dosya tanımlayıcısı, dosyaya erişim ve dosya üzerinde işlem yapmak için kullanılır. Eğer işlem başarısız olursa, -1 değeri döndürür.


en sık kullanılan flags parametreleri ve açıklamaları:

  1. O_RDONLY: Dosyayı sadece okuma modunda açar. Dosyanın içeriği değiştirilemez, sadece okunabilir.

  2. O_WRONLY: Dosyayı sadece yazma modunda açar. Dosyanın içeriği okunamaz, sadece değiştirilebilir.

  3. O_RDWR: Dosyayı hem okuma hem de yazma modunda açar. Dosya içeriğini okuyabilir ve değiştirebilirsiniz.

  4. O_CREAT: Eğer dosya yoksa, yeni bir dosya oluşturur. Bu bayrak, dosya açma işleminin yeni bir dosya oluşturma işlemi için kullanılacağını belirtir.

  5. O_TRUNC: Dosya varsa, içeriğini temizler (sıfırlar). Dosyayı açarken içeriği silmek ve dosyayı boşaltmak için kullanılır.

  6. O_APPEND: Dosya varsa, dosyanın sonuna ekler. Yani, her yazma işlemi dosyanın sonuna eklenir, varolan içeriği değiştirmez.

  7. O_EXCL: Dosya varsa, hata döndürür. Bu bayrak, O_CREAT bayrağıyla birlikte kullanılır ve eğer dosya zaten varsa hata döndürür.

  8. O_TRUNC | O_CREAT: Eğer dosya varsa içeriğini siler, eğer dosya yoksa yeni bir dosya oluşturur. Bu bayrak, dosya içeriğini sıfırlayarak mevcut dosyayı kullanmak için kullanılır.

#include <fcntl.h>  
#include <unistd.h>  
int  main() { 
	int fd; 
// Dosyay
View on GitHub
GitHub Stars8
CategoryDevelopment
Updated1mo ago
Forks0

Languages

C

Security Score

75/100

Audited on Feb 20, 2026

No findings