C – allocation de mémoire dynamic à l’aide d’un double pointeur

Je suis en train d’allouer de la mémoire dans un nom de fonction myalloc () et l’utiliser et le libérer dans main (). J’utilise un double pointeur pour le faire, voici le code qui fonctionne très bien,

//Example # 1 #include  #include  #include  void myalloc( char ** ptr) { *ptr = malloc(255); strcpy( *ptr, "Hello World"); } int main() { char *ptr = 0; myalloc( &ptr ); printf("Ssortingng is %s\n", ptr); free(ptr); return 0; } 

Mais le code suivant ne fonctionne pas et donne une erreur de segmentation. Je pense que c’est une autre façon d’utiliser les doubles pointeurs.

 //Example # 2 #include  #include  #include  void myalloc( char ** ptr) { *ptr = malloc(255); strcpy( *ptr, "Hello World"); } int main() { char **ptr = 0; myalloc( ptr ); printf("Ssortingng is %s\n", *ptr); free(*ptr); return 0; } 

S’il vous plaît clarifiez-moi, pourquoi il me donne seg faute dans le deuxième exemple.

Remarque: Langue = C, Compilateur = GCC 4.5.1, OS = Fedora Core 14

De plus, je sais que certaines questions ont déjà été posées concernant l’allocation de mémoire à l’aide de doubles pointeurs, mais elles ne traitent pas de ce problème. Veuillez donc ne pas le signaler comme une question répétitive.

 char **ptr = 0; *ptr = malloc(255); 

essaie d’écrire le pointeur renvoyé par malloc à l’adresse (de type char* ) indiquée par ptr. L’adresse s’avère être … 0 , ce qui n’est pas une mémoire inscriptible.

ptr devrait indiquer une adresse à laquelle vous pouvez écrire. Vous pouvez effectuer l’une des opérations suivantes:

 char *stackPtr; // Pointer on the stack, value irrelevant (gets overwritten) ptr = &stackPtr; // or char **ptr = alloca(sizeof(char*)); // Equivalent to above // or char **ptr = malloc(sizeof(char*)); // Allocate memory on the heap // note that ptr can be 0 if heap allocation fails 
 char **ptr = 0; foo( ptr ); 

Vous transmettez la valeur indiquée par ptr. Mais vous n’avez encore rien fait.

 *ptr = malloc(255); 

Maintenant, vous atsortingbuez de la mémoire à ce “rien”. Donc, cela ne fonctionnera pas et segfault. Pourquoi dites-vous que c’est une autre façon d’utiliser les doubles pointeurs? Je m’excuse si je me trompe, mais je suppose que vous avez déjà travaillé avec ce type de programme dans Turbo-C?

Dans le second cas, vous transmettez la valeur du ptr de main, qui est 0 (NULL), au myalloc() de myalloc() . myalloc() tente ensuite de déréférencer son pointeur nul, ptr .