Memset 没有将 char 指针归零

Memset not zeroing char pointer

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

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 没有归零?有人可以解释发生了什么吗?

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

memset(p,v,n) 将字节 v 写入由 p 和其后的 n-1 字节指向的字节。根本不碰指针p(按值传入,怎么会呢?)

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

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

并查看零 ;)

您对指针space被指向的区别感到困惑。

您的代码没有将指针归零。它将指向的 space 清零。 memset 函数以这种方式运行。事实上,您不想将指针归零,因为那样它就不再指向您分配的内存。

您的 printf 语句试图打印指针的值,即所指向的 space 的地址。不是指向 space 的内容。

实际上 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 *,在这种情况下就不需要强制转换了。

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

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);
    }
}