首页 > 解决方案 > 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?

问题描述

In the Below code , each location can hold 32 bit signed data. So, why doesn't the value a1 i.e 20 get stored at consecutive address de9? Array should store the data at consecutive memory location right? I know that the sizeof(int) in this online gdb compiler is 4 bytes but how can it be related to the storing of 20 at 4 locations away? Am I missing some basic concepts?

  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

标签: cpointersmemorygarbage

解决方案


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

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

您可以通过将指针定义为int *

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

在这种情况下,将指针递增一次 ( ptr2++) 将为您提供下一个元素。


推荐阅读