Memset不归零char指针

时间:2015-10-26 20:55:20

标签: c memset

我知道有很多这些,这可能是一个简单的问题,但我似乎无法弄明白:(

char * char_buffer = (char *) malloc(64);
printf("%x\n", char_buffer);
memset(char_buffer,
       0,
       64);

printf("%x\n", char_buffer);

输出:

50000910
50000910

为什么char_buffer没有归零?有人可以解释发生了什么吗?

4 个答案:

答案 0 :(得分:2)

您对指针空间指向之间的区别感到困惑。

您的代码不会将指针归零。它将指向的空间归零。 memset函数的行为就是这样。实际上你不想将指针归零,因为它不再指向你分配的内存。

您的printf语句尝试打印指针的值,该值是指向的空间的地址。不是指向的空间的内容。

实际上,printf语句会导致未定义的行为,因为格式说明符不匹配。你的编译器应该已经警告过这个。

以下是一些正确的代码:

printf("The buffer's address is %p\n", char_buffer);
printf("The buffer contains: %02X %02X %02X ...\n", 
    (unsigned char)char_buffer[0],
    (unsigned char)char_buffer[1],
    (unsigned char)char_buffer[2]);

要使用%X说明符,必须输入非负值,这就是必须使用强制转换的原因。您可以将缓冲区声明为unsigned char *,在这种情况下,不需要强制转换。

答案 1 :(得分:1)

您正在打印缓冲区的地址,而不是其内容。 memset()后内容 为零。试试吧:

printf("%d", char_buffer[0]);

并看到零;)

答案 2 :(得分:0)

您打印出指针,而不是缓冲区值。

memset(p,v,n)将字节v写入由pn-1字节指向的字节。它根本没有触及指针p(它按值传递,它怎么能?)

答案 3 :(得分:0)

要打印缓冲区,您必须循环它。我使用这样的东西:

void printbuf(char *buf, int size)
{
    int i = 0;
    char b = 0;
    for (i = 0; i < size; i++) {
        if (i % 8 == 0) {
            printf("\n%3d: ", i);
        }
        b = buf[i];
        printf("%2hhX ", b);
    }
}