繁体   English   中英

Memset不归零字符指针

[英]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函数的行为与此相同。 实际上,您不想将指针归零,因为它不再指向您分配的内存。

您的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 * ,在这种情况下,无需强制转换。

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

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

并看到零;)

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

memset(p,v,n)将字节v写入p指向的字节,之后再写入n-1个字节。 它根本不会碰到指针p (按值传递,怎么可能?)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM