Pourquoi un pointeur de caractère est-il uniquement affecté à un caractère, alors qu’une chaîne est supposée lui être affectée?

Une chaîne contient trois parties séparées par un espace. Les deux premières parties sont des chaînes et la troisième partie est un entier.

Le résultat du programme ci-dessous me surprend.

#include  #include  #include  void split(char *ch,char **part1,char **part2,int *num){ int length=strlen(ch), *lc1,*lc2; int i=0,j=0; printf("value of length is %d\n",length); printf("this function recieved %s for splitting into pieces\n",ch); lc1=(char *)malloc(length*sizeof(char)); lc2=(char *)malloc(length*sizeof(char)); while(ch[i]!=' '){ lc1[i]=ch[i]; printf("\nin loop with lc1[i] = %c and ch[i] = %c",lc1[i],ch[i]); i++; } lc1[i]='\0'; i++; while(ch[i]!=' '){ lc2[j]=ch[i]; printf("\nin loop with lc2[j] = %c and ch[i] = %c",lc2[j],ch[i]); j++; i++; } lc2[j]='\0'; i++; *num=atoi(&ch[i]); *part1=lc1; *part2=lc2; printf("\nsplit results are:\n"); printf("part1=%s and part2=%s and num=%d and lc1=%s lc2=%s //this is surprising me",*part1,*part2,*num,lc1,lc2); } int main() { int N,i,j,n,*numArray,count=0; char **arr,*part1,*part2,*token; scanf("%d",&N); arr=malloc(N*sizeof **arr); numArray=malloc(N*sizeof *numArray); for(i=0;i<N;i++){ arr[i]=(char *)malloc(50*sizeof(char)); } for(i=0;i<N;i++){ printf("plz enter %d th :",i); scanf(" "); gets(&arr[i][0]); } for(i=0;i<N;i++){ printf("%s",arr[i]); } for(i=0;i<N;i++){ /*token=strtok(arr[i]," "); part1=token; token=strtok(NULL," "); part2=token; token=strtok(NULL," "); n=atoi(token);*/ split(arr[i],&part1,&part2,&n); //some logic to use part1 and part2 of the sentence } return 0; } 

L’entrée que j’ai fournie est comme ci-dessous:

 1 abcd efgh 2 

La première ligne de l’entrée contient le nombre de phrases sur lesquelles je souhaite continuer. La sortie que j’ai obtenue est comme ci-dessous:

 plz enter 0 th :abcd efgh 2value of length is 11 this function recieved abcd efgh 2 for splitting into pieces in loop with lc1[i] = a and ch[i] = a in loop with lc1[i] = b and ch[i] = b in loop with lc1[i] = c and ch[i] = c in loop with lc1[i] = d and ch[i] = d in loop with lc2[j] = e and ch[i] = e in loop with lc2[j] = f and ch[i] = f in loop with lc2[j] = g and ch[i] = g in loop with lc2[j] = h and ch[i] = h split results are: part1=a and part2=e and num=2 and lc1=a lc2=e //this is surprising me Success time: 0 memory: 2296 signal:0 plz enter 0 th :abcd efgh 2value of length is 11 this function recieved abcd efgh 2 for splitting into pieces in loop with lc1[i] = a and ch[i] = a in loop with lc1[i] = b and ch[i] = b in loop with lc1[i] = c and ch[i] = c in loop with lc1[i] = d and ch[i] = d in loop with lc2[j] = e and ch[i] = e in loop with lc2[j] = f and ch[i] = f in loop with lc2[j] = g and ch[i] = g in loop with lc2[j] = h and ch[i] = h split results are: part1=a and part2=e and num=2 and lc1=a lc2=e //this is surprising me 

Bien que la fonction de boucle à l’intérieur de la méthode split () soit correctement exécutée pour tous les caractères de la chaîne, je n’ai cependant qu’un caractère dans Part1 (également dans lc1) et part2 (également dans lc2). Quelle est la raison de cette sortie?

    Cette ligne est fausse:

     arr=malloc(N*sizeof **arr); 

    CA devrait etre:

     arr=malloc(N*sizeof *arr); 

    **arr est un caractère, il char donc que de l’espace pour N octets, mais vous avez besoin d’espace pour N pointeurs, soit 4 octets. Donc, vous n’allouez pas assez d’espace, puis vous écrivez en dehors des limites du tableau, ce qui entraîne un comportement indéfini.

    DEMO