【问题标题】:Dynamic memory allocation from the heap从堆中动态分配内存
【发布时间】:2013-12-21 04:24:23
【问题描述】:
#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。但在那之后,当我想存储另一个整数时,这个指针显示另一个随机内存引用(这个映射解释就是我想要的。)

【问题讨论】:

    标签: c pointers memory malloc heap-memory


    【解决方案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++ 中的未定义行为。对于未定义的行为,程序不需要以任何特定的方式运行。它可以正常工作或崩溃或显示任何随机行为,简单的行为是未定义的。

    【讨论】:

    • 但它的工作。所以你说编译器自动分配内存?顺便说一句,这是一个美丽的解释!谢谢!
    • @bks4line: A good read。如果您使用 C 和 C++,理解这些概念很重要。
    【解决方案2】:

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

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

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

    【讨论】:

    • 你不小心把malloc的返回值投了。不要那样做。
    • 我改了。但为什么?有什么问题?
    • 强制转换没有任何好处,但它可以隐藏错误并降低可读性。
    猜你喜欢
    • 2013-04-04
    • 2019-05-17
    • 1970-01-01
    • 2019-09-23
    • 2011-12-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多