2016-04-12 17 views
-2

Bugün bir meslektaşımla bir noktada konuşarak hata yaptım - I.e. hataları (veya bir alarm zili olmalıdır azından kalıplarını) iyi bir programcı"Her zaman yanlış" snippet'lerinin listesi C

böyle desen benzer Snippet'leri
x = malloc (strlen(y)); 

while (!feof (f)) { 
    ... 
} 

char *f(){ 
    char x[100]; 
    ... 
    return x; 
} 

gibi tek bakışta fark etmek mümkün olmalıdır kodunda? Bir süre bu

+0

'void foo (T dizisi []) {sizeof (dizi)}' – EOF

+7

Sorunuzun ilginç olduğunu düşünüyorum, ancak SO için değil. Belki programmers.stackexchange.com için – ppaulojr

+0

İlki nedir? –

cevap

2
char *buf; 
scanf("%s", buf); 

Bu yanlış kendi kişisel sık olacak hiçbir bellek buf için tahsis edildiği için ben, SO olmuştur kimseye tavsiye ediyor. scanf bir char * değil, bir char (*)[n] bekler çünkü

char buf[100]; 
scanf("%s", &buf); 

Bu, yanlıştır. EOF bir char aralığında uymuyor çünkü

char c; 
while ((c = getchar()) != EOF) 
    putchar(c); 

Bu, yanlıştır. Bunun yerine int kullanın. Bu

#define IN 0; 

bir #define sonunda noktalı virgül koymayın, Microsoft C gibi bazı derleyiciler bir uzantısı olarak uygulanmaktadır olsa

fflush(stdin); 

fflush, stdin gibi akarsu girişi için tanımlanmamış. realloc dön geçersiz yapacak çünkü

blk = realloc(blk, n); 

realloc başarısız olursa

, blk herhangi içeriğini kaybolacaktır. Sorunu çözmek için, dönüş değerini geçici olarak kopyalayın ve yalnızca geçici NULL değilse, nihai hedefe kopyalayın.

+0

Bir diğeri: T dizisinden sonra [n]; '' dizinin '' dizisi '' T ** 'olmasını bekliyor. – EOF

+0

Downvote açıklaması? – stackptr

+0

İkinci örneğiniz, yorumda bulunduğum çok yanlışı ifade ediyor. – EOF