להלן כמה דוגמאות "טובות" ו"רעות".
==== Good Examples ==== good example: good1.c 1 int main(int argc, char ** argv) { 2 int one, two, three; 3 int *pn = &one; 4 *pn = 1; /* Now: one == 1 */ 5 pn = &two; 6 *pn = 2; /* Now: two == 2 */ 7 three = one + (*pn); 8 return three; } gcc -Wall -o /tmp/dum good1.c good example: good2.c 1 #include <stdlib.h> 2 3 void setvars(int *p_n, char **p_s, int **p_pa) 4 { 5 enum { N = 7 }; 6 *p_n = N; 7 *p_s = "foo"; 8 *p_pa = malloc( N * sizeof(int) ); 9 } 10 11 int main(int argc, char ** argv) { 12 int n; 13 char *s; 14 int *pa; 15 setvars(&n, &s, &pa); 16 return 0; } gcc -Wall -o /tmp/dum good2.c good example: good3.c 1 #include <stdlib.h> 2 3 void set_malloc(int **p_pn) 4 { *p_pn = malloc( 3 * sizeof(int) ); } 5 6 void set_realloc(int **p_pn) 7 { 8 int *pn; 9 pn = *p_pn; /* get the pointer to int */ 10 pn = realloc(pn, 7 * sizeof(int)); 11 *p_pn = pn; /* put the new pointer to caller */ 12 } 13 14 int main(int argc, char ** argv) { 15 int *pn; 16 set_malloc(&pn); 17 set_realloc(&pn); 18 return 0; } gcc -Wall -o /tmp/dum good3.c ==== Bad Examples ==== Bad example: bad1.c 1 int main(int argc, char ** argv) { 2 int *pn = 13; /* pointer should not be assigned simple int */ 3 return *pn; /* make it used */ } gcc -Wall -o /tmp/dum bad1.c bad1.c: In function ‘main’: bad1.c:2: warning: initialization makes pointer from integer without a cast Bad example: bad2.c 1 int main(int argc, char **argv) { 2 int *pn; 3 pn = 13; /* pointer should not be assigned simple int */ 4 return *pn; /* make it used */ } gcc -Wall -o /tmp/dum bad2.c bad2.c: In function ‘main’: bad2.c:3: warning: assignment makes pointer from integer without a cast Bad example: bad3.c 1 int main(int argc, char **argv) { 2 int m, n; 3 int *pn = &m; /* OK */ 4 n = pn; /* int should not be assigned a pointer */ 5 return *pn; /* make it used */ } gcc -Wall -o /tmp/dum bad3.c bad3.c: In function ‘main’: bad3.c:4: warning: assignment makes integer from pointer without a cast Bad example: bad4.c 1 #include <stdlib.h> 2 void set_malloc(int *pn) 3 { 4 pn = malloc(sizeof(int)); /* OK, but no one will use it :( */ 5 } 6 7 int main(int argc, char **argv) { 8 int *pn; 9 set_malloc(pn); /* Legal in C, but useless */ 10 *pn = 7; /* Will fail at runtime !! */ 11 return *pn; /* make it used */ } gcc -Wall -o /tmp/dum bad4.c bad4.c: In function ‘main’: bad4.c:9: warning: ‘pn’ is used uninitialized in this function |