在下面的代码中,每个位置都可以保存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++
(将获得下一个元素。