在下面的与指针及其输出相关的 C 代码中,为什么值 a[1] 即 20 不存储在连续地址 de9 中?



在下面的代码中,每个位置都可以保存32位签名数据。那么,为什么值a1(即20(不存储在连续地址de9?数组应该将数据存储在连续的内存位置,对吗?我知道这个在线gdb编译器中的sizeof(int(是4个字节,但它怎么能与在4个位置之外存储20有关呢?我是不是遗漏了一些基本概念?

int main()
{
int a[2]= {214748368,20};

void *ptr1 = &a;
void *ptr2= &a;

ptr1++;
ptr2 = ptr2;

printf("%d n", *(int*)ptr2);
printf("n Pointer table");
printf("n Data : %d at address : %p", *(int*)ptr2, ptr2);
ptr2=ptr2+1;
printf("n Data : %d at address : %p", *(int*)ptr2, ptr2);
ptr2=ptr2+1;
printf("n Data : %d at address : %p", *(int*)ptr2, ptr2);
ptr2=ptr2+1;
printf("n Data : %d at address : %p", *(int*)ptr2, ptr2);
ptr2=ptr2+1;
printf("n Data : %d at address : %p", *(int*)ptr2, ptr2);
return 0;
}

代码输出

当您在C中增加指针时,将使用指针算术。因此,如果您的指针a的类型为int *,它将增加sizeof(int)。但是,您的指针的类型是void *。这不是有意的,显然它增加了一个字节(见此处(。

由于系统上int的大小是32位或4个字节,因此必须将指针增加四倍一个字节才能到达数组中的下一个元素。

您可以通过将指针定义为int *:来避免此问题

int *ptr1 = &a;
int *ptr2 = &a;

在这种情况下,将指针增加一次(ptr2++(将获得下一个元素。

最新更新