Deux choses sont mal à cela:
char data[] = "world";
est-probablement créé dans le cadre du cadre de pile de la fonction. Les tableaux se dégradent en pointeurs. En tant que tel, lorsque la fonction appelle ret
, il aurait dû nettoyer sa pile et la mémoire à cette adresse a disparu. Si une opération fonctionne ici, c'est parce que vous n'avez pas encore écrasé la mémoire.
Que pourriez-vous faire? Déclarez-le static
est une solution qui garantit (selon c99 au moins) l'existence du programme-vie (c'est-à-dire qu'elle ne sera pas allouée sur la pile mais dans le segment de données, et la bibliothèque c l'alloue avant main). Cependant, comme je soupçonne que c'est juste une démo, il convient de souligner que:
char data[] = "world";
memcpy(d, data, 5);
est parfaitement valide, puisque vous copiez le contenu et ne pointent pas vers des valeurs.
newData(&testPointer);
Vous faites une erreur simple ici. Un pointeur, dans l'assemblage, est une adresse mémoire contenant une autre adresse mémoire. Lorsque vous passez un pointeur sur une fonction, vous voulez passer cette adresse mémoire, de sorte que lorsque vous appelez cette fonction, le contenu du pointeur, une adresse mémoire, est copié sur la pile sous la forme d'un nouveau pointeur. Bien sûr, ces deux pointeurs pointent vers la même chose, qui est la façon dont vous finissez par atteindre une chose de type passer-par-référence. Si vous ne me croyez pas, regardez-le dans un débogueur. Cependant, ce que vous faites est de passer l'adresse d'un pointeur, ainsi vous créez un pointeur vers un pointeur vers une valeur. Imaginez la mémoire comme ceci:
|Address|Value
|0x120 |0x121 <-- this is what you're passing with &testPointer
|0x121 |0x122 <-- this is a pointer; it contains the address of a value
|0x122 |h <-- this is a value.
|0x123 |e
|0x124 |l
...
J'espère que cela le rendra plus clair. Dans ma mémoire simpliste, vous passez 0x120
plutôt que 0x121
. Vous pouvez bien sûr déréférencer deux fois, mais pourquoi? La solution simple est juste pour passer le pointeur comme ceci:
newData(testPointer);
Le type d'argument est erroné, il devrait être vide ** . –
Ou simplement l'appeler comme 'newData (testPointer); '? – John
'void * testPointer = & testData;' L'opérateur d'adresse n'est pas requis dans cette instruction. Lorsque vous affectez un tableau à un pointeur, l'adresse du tableau est affectée. Donc, à la place, vous pouvez faire 'void * testPointer = testData;'. Il existe d'autres instructions dans votre programme où vous pouvez le faire. – Mahesh