C 结构上出现意外的内存转储



设置C结构如下:

    struct test {
    char name[20];
    };

在使用以下代码初始化之前逐字节转储它时:

 struct test real_name;
 raw_ptr = (char*) &real_name;
 for(i=0; i < sizeof (real_name); i++)
 printf("raw_ptr [0x%016lx]t0x%02xn",
            (unsigned long int)&raw_ptr[i],
            (unsigned int)raw_ptr[i]);

我得到以下输出:

    raw_ptr [0x00007ffe5211d780]    0x40
    raw_ptr [0x00007ffe5211d781]    0x57
    raw_ptr [0x00007ffe5211d782]    0x08
    raw_ptr [0x00007ffe5211d783]    0xffffffa8 <-
    raw_ptr [0x00007ffe5211d784]    0xffffff82 <-
    raw_ptr [0x00007ffe5211d785]    0x55  
    ...

我的问题是为什么两个标记的行以八个字节而不是两个字节的大小显示?

我希望

raw_ptr被定义为char,并且似乎在您的环境中char是有符号的(请注意:char数据类型的符号是实现定义的(。

因此,在(unsigned int)raw_ptr[i])表达式中,signed char被强制转换为unsigned int但在此之前,该值被提升为int,这也意味着符号必须扩展到适当的数据类型大小。然后在调用之后,打印不可能只使用 2 个字符,因此它会忽略您的宽度说明符。

最新更新