[英]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.