在下面这个与指针及其输出相关的 C 代码中,为什么值 a[1](即 20)没有存储在连续的地址 de9 中?
In this below C code related to pointers and its output, then why doesn't the value a[1] i.e 20 get stored at consecutive address 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;
}
Code Output
当你增加一个指针时,在 C 中使用指针算法。因此,如果您的指针 a
是 int *
类型,它将增加 sizeof(int)
。但是你的指针是 void *
类型的。这不是故意的,显然它增加了一个字节(参见here)。
由于系统上 int
的大小为 32 位或 4 字节,因此您必须将指针增加四次一个字节才能到达数组中的下一个元素。
您可以通过将指针定义为 int *
:
来避免此问题
int *ptr1 = &a;
int *ptr2 = &a;
在这种情况下,将指针递增一次 (ptr2++
) 将为您提供下一个元素。
在下面的代码中,每个位置可以容纳 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;
}
Code Output
当你增加一个指针时,在 C 中使用指针算法。因此,如果您的指针 a
是 int *
类型,它将增加 sizeof(int)
。但是你的指针是 void *
类型的。这不是故意的,显然它增加了一个字节(参见here)。
由于系统上 int
的大小为 32 位或 4 字节,因此您必须将指针增加四次一个字节才能到达数组中的下一个元素。
您可以通过将指针定义为 int *
:
int *ptr1 = &a;
int *ptr2 = &a;
在这种情况下,将指针递增一次 (ptr2++
) 将为您提供下一个元素。