我知道有很多这些,这可能是一个简单的问题,但我似乎无法弄明白:(
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没有归零?有人可以解释发生了什么吗?
答案 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
写入由p
和n-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);
}
}