写程序的时候发现了一个奇怪的现象,调了好久。
话不多说,先上代码
struct Message
{
int id;
int len;
};
int main(int argc, const char *argv[])
{
int len = sizeof(struct Message) + 128;
char *buf = (char *)calloc(len, sizeof(char));
memset(buf, 1, len * sizeof(char));
buf[len - 1] = '\0';
printf("strlen(buf) = %lu\n", strlen(buf));
printf("buf = \"%s\"\n", buf);
strcpy(buf, "123456789123456789123456789");
struct Message *message = reinterpret_cast<struct Message *>(buf);
message->id = 1;
message->len = 2;
printf("strlen(buf) = %lu\n", strlen(buf));
printf("buf = \"%s\"\n", buf);
printf("strlen(buf) = %lu\n", strlen(buf + sizeof(struct Message)));
printf("buf = \"%s\"\n", buf + sizeof(struct Message));
return 0;
}
说说遇到的问题,程序中共有三个输出buf大小和内容的地方。
第一个地方,上面我是用memset在buf里面填充了1的,但是虽然可以看到buf的长度是135,但是内容打印出来却是空的。也就是说buf里面实际上是填充了内容的,但是打印不出来。
在另一个程序中相同代码用gdb是可以看到值的。不知道为什么。
第二个地方,用了类型转换。并在结构体中填充了数值。但是打印的时候strlen算不出来结构体的大小,不知道为什么,可能是结构体中间有\0的存在吧。而且打印%s也是没有值的。就是这里,找了好久才找到,一度以为强转有问题。
第三个地方,跳过前面结构体的大小打印buf的值。可以看到,buf里面的值还是存在的。strcpy会复制最后的\0,所以大小会变。