结构体大小无法用strlen算出来

写程序的时候发现了一个奇怪的现象,调了好久。

话不多说,先上代码

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,所以大小会变。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值