2017-10-12 16 views
-5

La variable pointeur contient la valeur qui n'est rien d'autre qu'une adresse de l'emplacement de mémoire qui doit être effacée pour la prochaine 20 octets de données.comment effacer la variable de pointeur qui maintient le début de l'emplacement de mémoire devant être effacé pour 20 octets de données de l'emplacement de départ

J'ai essayé l'extrait de code ci-dessous mais il efface la valeur de la valeur du pointeur (adresse de l'emplacement de la mémoire de démarrage). Ce faisant, j'ai perdu l'adresse de début de l'emplacement de la mémoire (valeur du pointeur).

srcadr = 0x105fc080; 

i = 20; 

*srcptr = &srcadr 

if(srcptr != NULL) 
{ 

    while (i < 20) 

    { 
     *srcptr++ = 0x00; 
    } 

} 
+2

Ce code n'a aucun sens. '* srcptr = & srcadr' définit le pointeur sur l'adresse de' srcadr', pas sur l'adresse absolue '0x105fc080'. De plus, personne ne peut répondre à cette question sans voir les déclarations de variables. – Lundin

+3

En outre, qu'est-ce que cela a à voir avec les systèmes embarqués, les pointeurs intelligents et les pointeurs de vide? – Lundin

+2

Y a-t-il une forte odeur de XY dans l'air? –

Répondre

-2

Utilise la fonction memset de la bibliothèque string.h.

#include <string.h> 

    char *srcadr = 0x105fc080; 
    int size = 20; 
    memset(srcdr,0,size); 
+1

'char * srcadr = 0x105fc080;' n'est pas valide C donc ce code ne sera pas compilé. – Lundin

+0

** En raison de contraintes dans le projet, memset n'est pas disponible – danny

+0

La réponse de unwind semble correcte et correcte. Les adresses absolues sont étranges de toute façon, d'où vient l'adresse? De plus, votre boucle ne change pas la valeur de i. –

1

Votre code est incomplet.

Mais supposons que cette première ligne est valide:

srcadr = 0x105fc080; 

cela signifie srcadr peut être un entier non signé (ou unsigned long).

Ensuite, nous devons traiter cela comme un pointeur et d'effacer 20 octets de cette adresse:

volatile unsigned char * const area = (unsigned char *) srcadr; 
for(int i = 0; i < 20; ++i) 
    area[i] = 0; 

Le casting est nécessaire afin de traiter la valeur d'adresse comme un pointeur. L'utilisation de &srcadr n'a aucun sens, ce qui nous donne l'adresse de la variable de pointeur srcadr, ce qui n'est pas pertinent.

Note pour les futurs lecteurs: si vous pouvez, bien sûr, vous souhaitez simplement utiliser ce memset() comme ceci:

memset((void *) 0x105fc080, 0, 20); 

et faire. Mais l'OP ne peut pas l'utiliser pour une raison quelconque, c'est peut-être un environnement embarqué avec une bibliothèque standard limitée (et, par exemple, un compilateur terne sans intrinsèque).

-1

Si tout ce que vous voulez faire est de définir 20 octets de mémoire à 0, vous pouvez utiliser memset. Tout ce que vous avez à faire est:

#include <string.h> 

mem_len = 20 
mem_value = 0 
ptr = 0x105fc080 

memset(ptr. mem_value, mem_len)