Şimdi insanlar bunu bir kopya olarak işaretlemeye başlamadan önce, aradığım cevabı hiçbiri sağlamayan aşağıdakilerin hepsini okudum:
- C SSS: malloc'un dönüş değerini dökümde yanlış olan ne?
- SO: malloc () 'un dönüş değerini açıkça değiştirmeli miyim?
- SO: C'deki gereksiz işaretçiler
- SO: Malloc'un sonucunu yayınlıyor muyum?
Hem C SSS'si hem de yukarıdaki sorulara verilen birçok cevap, çevrimin mallocdönüş değerinin gizleyebileceği gizemli bir hatadan bahsediyor ; ancak bunların hiçbiri pratikte böyle bir hatanın belirli bir örneğini vermez. Şimdi uyarı değil hata dediğime dikkat edin .
Şimdi aşağıdaki kod verilmiştir:
#include <string.h>
#include <stdio.h>
// #include <stdlib.h>
int main(int argc, char** argv) {
char * p = /*(char*)*/malloc(10);
strcpy(p, "hello");
printf("%s\n", p);
return 0;
}
Yukarıdaki kodu gcc 4.2 ile cast ile ve olmadan derlemek aynı uyarıları verir ve program düzgün bir şekilde çalışır ve her iki durumda da aynı sonuçları verir.
anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
anon@anon:~/$ ./nostdlib_malloc
hello
Öyleyse herhangi biri, dökümün mallocdönüş değeri nedeniyle oluşabilecek bir derleme veya çalışma zamanı hatası için belirli bir kod örneği verebilir mi, yoksa bu sadece bir şehir efsanesi mi?
Düzenleme Bu konuyla ilgili iyi yazılmış iki argümanla karşılaştım:
- Casting Lehine: CERT Advisory: Bir bellek ayırma fonksiyonu çağrısının sonucunu hemen tahsis edilen tipe bir göstericiye çevirin
- Yayına Karşı (2012-02-14 itibariyle 404 hatası: 2010-01-27 tarihli İnternet Arşivi Wayback Makinesi kopyasını kullanın . {2016-03-18: "robots.txt nedeniyle sayfa taranamıyor veya görüntülenemiyor."})
voidişaretçiler C ++ gibi kod derlemek sağlar; bazı insanlar bunun bir özellik olduğunu söylüyor, bunun bir hata olduğunu söyleyebilirim;)