来自堆的动态内存分配

时间:2013-12-04 15:36:00

标签: c pointers memory malloc heap

#include<stdio.h>
#include<stdlib.h>

int main ()
{
    int a,n;
    int * ptr_data;


    printf ("Enter amount: ");
    scanf ("%d",&a);
    int arr[a];
    ptr_data = (int*) malloc ( sizeof(int) );
    for ( n=0; n<a; n++ )
    {
        printf ("Enter number #%d: ",n);
        scanf ("%d",&ptr_data[n]);
    }

    for ( n=0; n<a; n++ )
        arr[n] = ptr_data[n]; //values in heap are copied to an array.
    printf("%d\n",sizeof(ptr_data));
    free (ptr_data);
    printf ("Output: ");
    for ( n=0; n<a; n++ )
        printf("%d\n",arr[n]);
    return 0;
}

sizeof函数将指针的大小打印为4(整数的大小)。但是我运行一个循环来获取要存储在堆中的值(scanf,。),那么这个后续的指针指针映射是如何在第一次之后发生的?就像在第一次我明确编码ptr_data包含大小4.但在那之后,当我想存储另一个整数时,这个指针显示另一个随机内存引用(这个映射解释是我想要的。)

2 个答案:

答案 0 :(得分:1)

您的代码中包含的是未定义的行为

 ptr_data = (int*) malloc ( sizeof(int) );

分配内存,相当于堆上单个整数的大小,ptr_data指向此分配的内存。此外,

for ( n=0; n<a; n++ )
{
    printf ("Enter number #%d: ",n);
    scanf ("%d",&ptr_data[n]);
}

写入超出分配内存的范围:

ptr_data[n];

相当于:

*(ptr_data + n);

请注意,写入超出属于您的内存范围会导致C和C ++中的未定义行为。对于未定义的行为,程序不需要以任何特定方式运行。许多工作正常或崩溃或显示任何随机行为,简单的行为是未定义的。

答案 1 :(得分:0)

ptr_data = (int*) malloc ( sizeof(int) )仅为一个整数指针分配内存。您正在尝试为ptr_data分配多个值。如果你想这样做,那么:

ptr_data = malloc (sizeof(int) * a); 

这将为int a整数提供指针空间。