2017-04-07 1 views
0

Je suis nouveau à la programmation C, J'ai une structure avec char et int pointeur, j'ai utilisé pour modifier ce pointeur fréquemment, found some reference in online to realloc char * et son fonctionnement bien, mais la même chose quand je l'ai utilisé à l'intérieur la structure problème se pose signifie,Realloc char * à l'intérieur de la structure

typedef struct MyStruct 
{ 
    int* intPtr; 
    char* strPtr; 
} Mystruct; 

intérieur main()

Mystruct *myStructPtr; 
myStructPtr = new Mystruct(); 
myStructPtr->intPtr = new int(); 
*myStructPtr->intPtr = 10; 

myStructPtr->strPtr = (char *)malloc(sizeof("original")); 
myStructPtr->strPtr = "original"; 
printf("String = %s, Address = %u\n", myStructPtr->strPtr, myStructPtr->strPtr); 

myStructPtr->strPtr = (char *)realloc(myStructPtr->strPtr, sizeof("modified original")); 
myStructPtr->strPtr = "modified original"; 
printf("String = %s, Address = %u\n", myStructPtr->strPtr, myStructPtr->strPtr); 

J'ai trouvé erreur suivante tout en réaffectant le char * pointeur à l'intérieur

Cela peut être dû à une corruption du tas, qui indique un bogue ou l'un des DLL qu'il a chargé.

+2

Ce n'est pas C. C n'a pas 'new' comme mot-clé. –

+4

Pourquoi mélangez-vous C avec C++? à la fois 'new' et' malloc'? Stick avec un .. – Arash

+0

[La FAQ C++] (https://isocpp.org/wiki/faq/freestore-mgmt#mixing-malloc-and-delete) – Lundin

Répondre

3

Le problème ici est, après l'allocation de mémoire

myStructPtr->strPtr = (char *)malloc(sizeof("original")); 

vous êtes le pointeur d'écraser retourné

myStructPtr->strPtr = "original"; 

puis, vous essayez d'utiliser realloc() sur un pointeur qui est pas retourné par une fonction allocateur de mémoire. Cela provoque undefined behavior.

C11 Citant, chapitre §7.22.3.5

Si ptr est un pointeur NULL, la fonction realloc se comporte comme la fonction malloc pour la taille spécifiée. Dans le cas contraire, si ptr ne correspond pas à un pointeur plus tôt retourné par une fonction de gestion de la mémoire , ou si l'espace a été désallouée par un appel à la fonction free ou realloc, le comportement est indéfini. [....]

Cela dit, vous ne devez jamais utiliser %u pour imprimer un pointeur lui-même, youust utiliser %p spécificateur de format et jeté Teh argument correspondant à (void *).

Solution Vous devez soit

  • Après malloc(), utilisez strcpy() pour copier le contenu dans la région de mémoire allouée, pointée par le pointeur de retour malloc() appel. Se débarrasser de malloc() et utiliser non standardstrdup(). Malloc alloue de la mémoire et stocke l'adresse dans myStructPtr-> strPtr.
+0

Merci pour la réponse @Sourav Ghosh, mais si j'utilise soit strcpy() ou strdup() cela va créer une nouvelle adresse. Je veux que mon type de char * soit réaffecté à la taille et à la valeur avec la même adresse. C'est possible? parce que j'ai trouvé l'adresse de char * peut maintenir la même adresse même après l'utilisation de realloc dans https://www.tutorialspoint.com/c_standard_library/c_function_realloc.htm –

+0

@ ǨÅVËĔŊRÂǞĴĄŅ 'strcpy()' jamais _creates_ n'importe quelle adresse, en soi. –

+0

Lors de l'utilisation de 'strcpy()' il montre évaluer violation de violation 'Tenté de lire ou d'écrire de la mémoire protégée. C'est souvent une indication que l'autre mémoire est corrompue. » –

2

Ensuite, vous rendez le pointeur sur l'emplacement de la constante de chaîne "original".

Vous ne pouvez pas réaffecter l'emplacement de la chaîne consant.Au lieu d'affecter un original au pointeur, vous devez le copier à l'emplacement indiqué par le pointeur.

const char* originalStr = "original"; 
memcpy (myStructPtr->strPtr, originalStr , strlen(originalStr)+1);