2017-10-12 73 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) 
相关问题