gpt4 book ai didi

c - 手动单步执行 C 中的结构

转载 作者:行者123 更新时间:2023-11-30 18:35:18 26 4
gpt4 key购买 nike

我不明白为什么我不能以这种方式打印出整数 b 和 c:

#include "stdio.h"

typedef struct{
int a;
int b;
int c;
} myStruct;

int main(){

myStruct MS;
MS.a = 13;
MS.b = 27;
MS.c = 39;

myStruct* pMS = &MS;

printf("pMS = %u\n", pMS );
printf("&a = %u\n", &pMS->a ); // addr of a is addr of struct
printf("&b = %u\n", &pMS->b ); // addr of b is +4 from a
printf("&c = %u\n", &pMS->c ); // addr of c is +8 from a

printf("*pMS = %d\n",*(pMS) );
printf("*pMS+4 = %d\n",*(pMS+4) );
printf("*pMS+8 = %d\n",*(pMS+8) );
}

终端显示 b 和 c 的虚假值(至少,我认为 b 和 c 应该位于 pMS+4 和 pMS+8):

gcc version 4.6.3

pMS = 1926301980
&a = 1926301980
&b = 1926301984
&c = 1926301988
*pMS = 13
*pMS+4 = 32765
*pMS+8 = 32765

最佳答案

pMS+4不是位于结构起始位置之外四个字节的整数的地址。对指针的添加是根据指针类型进行缩放的,因此,如果它是指向整数的指针,那么它将超出起始位置四个整数(如果有 32 位整数,则为 16 个字节)。例如,参见:

int someInt[2] = {4, 9}; // assume 4-byte int, big-endian
int *x = &someInt[0];

// | someInt[0] @ 0x1000 | someInt[1] @ 0x1004 |
// | 0,0,0,4 | 0,0,0,9 |
// | x = 0x1000 | x+1 = 0x1004 |
// | *(x) = 4 | *(x+1) = 9 |

但是,在您的情况下,情况更糟,因为您的指针指向实际的结构。这意味着它按整个结构的大小进行缩放,三个完整的整数(如果需要的话加上填充)。

关于c - 手动单步执行 C 中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47147476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com