2017-10-12 81 views
-5

指針變量保存的值只是需要爲下一個清除的內存位置的地址20個字節的數據。如何清除指針變量,該指針變量需要從開始位置的20個字節的數據中清除內存位置的起始地址

我試過下面的代碼片段,但它清除指針值(開始內存位置的地址)的值。通過這樣做,我失去了內存位置的起始地址(指針值)。

srcadr = 0x105fc080; 

i = 20; 

*srcptr = &srcadr 

if(srcptr != NULL) 
{ 

    while (i < 20) 

    { 
     *srcptr++ = 0x00; 
    } 

} 
+2

此代碼沒有任何意義。 '* srcptr =&srcadr'設置指針指向'srcadr'的地址,而不是指向絕對地址'0x105fc080'。而且,沒有看到變量聲明,沒有人能回答這個問題。 – Lundin

+3

另外,這與嵌入式系統,智能指針和void指針有什麼關係? – Lundin

+2

空氣中是否有強烈的XY-問題氣味? –

回答

-2

從string.h庫中使用memset函數。

#include <string.h> 

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

'char * srcadr = 0x105fc080;'是無效的C,所以這段代碼不會編譯。 – Lundin

+0

**由於項目中的限制,memset不可用 – danny

+0

放鬆的答案似乎是正確和合理的。無論如何,絕對地址是奇怪的,地址來自哪裏。你的循環也不會改變我的價值。 –

1

您的代碼不完整。

但是讓我們假設這第一行是有效的:

srcadr = 0x105fc080; 

這意味着srcadr可以一個unsigned int(或無符號長)。

然後,我們需要把它看成一個指針,並從該地址明確的20個字節:

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

演員是必要的,以便處理的地址值作爲一個指針。使用&srcadr毫無意義,它給了我們指針變量的地址,這是不相關的。

爲未來的讀者請注意:如果你可以,當然你只需要使用memset()這個像這樣:

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

和完成。但是OP無論如何都不能使用它,也許這是一個嵌入式環境,它具有有限的標準庫(並且,呃,沒有內在的沉悶編譯器)。

-1

如果您只想將20字節的內存設置爲0,則可以使用memset。 所有你需要做的是:

#include <string.h> 

mem_len = 20 
mem_value = 0 
ptr = 0x105fc080 

memset(ptr. mem_value, mem_len)