2017-06-12 4 views
-2

Bonjour tout le monde. Je suis relativement nouveau à la programmation et j'essaie actuellement d'apprendre la programmation en langage C pour progresser dans l'un de mes projets. Je viens d'apprendre comment utiliser malloc et realloc, et tout semblait bien jusqu'à ce que j'essaie d'utiliser strcat pour combiner deux chaînes données d'un tableau multidimensionnel.caractère manquant lors de l'utilisation de Realloc et strcat sur un tableau multidimensionnel?

Je suis censé obtenir une combinaison de deux chaînes basées sur les entrées de l'utilisateur, et étrangement, le premier caractère est soit manquant ou remplacé par d'autres caractères ... Je vais inclure le code source ainsi que la sortie ci-dessous . J'apprécierais vraiment votre aide. Merci d'avance!! (Ne me dérange pas le sud-coréen à la fin ... Je suis coréen: P)

enter code here 
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 


int main(void) 
{ 
int i, j; 
const int row = 3; 
char *pstr[3]; 
char temp[100]; 
int k,p = 0; 




printf("Type in any three characters\n"); 
for (i = 0; i < row; i++) 
{ 
    pstr[i] = (char *)malloc(strlen(temp) + 1); //initialize the lenght of the elements in 2 part of 2D array of char b[ROW] via length of the given string 
} 
for (i = 0; i < row; i++) 
{ 
    scanf("%s", temp); 
    strcpy(pstr[i], temp); 
} 
printf("\n"); 

for (i = 0; i < row; i++) 
{ 
    printf("%s\n", pstr[i]); 
} 

    scanf("%d", &p); 
    scanf("%d", &k); 

printf("%s\n", pstr[p]); 
printf("%s\n", pstr[k]); 

*pstr[k] = (char *)realloc(pstr[k], strlen(pstr[p])+100); 

strcat(pstr[k], pstr[p]); 
printf("%s", pstr[k]); 


for (i = 0; i < row; i++) 
{ 
    free(pstr[i]); 
} 

return 0; 
} 

\ sortie :: LINK IS AN INTERNATIONAL SIGN FOR , IMAGE OVER HERE!!!

+0

Il n'y a pas de tableau multidimensionnel dans votre code! Un pointeur n'est pas un tableau. – Olaf

+0

Et ne postez pas d'images de texte! – Olaf

+0

@ tilz0R: Pourquoi ne pas simplement fournir le lien? Mais vous pourriez avoir une nouvelle, bonne résonance pourquoi la distribution est justifiée. – Olaf

Répondre

1

Deux problèmes majeurs:

  1. Vous utilisez temp avant qu'il ait été initialisé, lorsque son contenu est indéterminé et que cela conduira à comportement indéfini.

  2. Lorsque vous faites *pstr[k] = realloc(...) vous déréférencer le pointeur dans pstr[k] et obtient son premier élément, qui est un seul caractère. Vous affectez ensuite le résultat de l'appel realloc à cet élément char. Donc, vous perdez fondamentalement le pointeur réel et pstr[k] pointera toujours vers la même mémoire (qui peut maintenant être invalide).

Il existe d'autres problèmes, mais ces deux problèmes sont les plus graves.

+0

Merci pour la réponse. J'ai changé le code comme vous l'avez dit, et j'ai aussi changé le code parce que j'avais l'impression d'avoir des erreurs. Mais je veux toujours utiliser strlen. Y a-t-il des moyens de le faire? –

+0

Oh ... nv esprit. Je viens de le réparer merci. Je suppose que c'était une question assez stupide maintenant je regarde en arrière –

0

Je les ai trouvées dans votre code

1) si k ou p est supérieur à 2, il donnera erreur d'exécution

2) *pstr[k] = (char *)realloc(pstr[k], strlen(pstr[p])+100);

mais cette ligne peut donner erreur dans la compilation aussi (mac au moins) - car ils ne sont pas même donc vous pouvez changer comme ça -

*pstr[k] = *(char *)realloc(pstr[k], strlen(pstr[p])+100); 

3) Après realloc vous allez ge t exception en gratuit. voir ceci - How free memory after of realloc