C中数组的动态分配

时间:2015-04-29 15:58:52

标签: c pointers initialization malloc

 #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    int  *alocare(int *a, int *n)
    {
        printf("Introduceti numarul de elemente din sir");
        scanf("%d", n);
        a = (int*)(malloc(*n*sizeof(int))); //alocam memorie dinamica (in zona Heap) pentru memorarea unui vector in mod dinamic de n elemente
        if (!a)
        {
            printf("Eroare la alocare\n");
            return 0;
        }
        return a;

    }
    void citire(int *a, int n)
    {
        for (int i = 0; i < n; i++)
        {
            printf("\telem %d\n", i + 1);
            scanf("%d", &a[i]);
        }
    }
    void afisare(int *a, int n)
    {
        for (int i = 0; i < n; i++)
                printf("%d\n", a[i]);

    }
    void main(void)
    {
        int *a, n;
        a=alocare(a, &n);
        citire(a, n);
        afisare(a, n);
        _getch();
    }

我得到的错误是

  

错误C4700:使用了单位化的局部变量'a'。

我如何初始化变量a?为什么必须初始化?因为我有分配功能。

1 个答案:

答案 0 :(得分:1)

您正在函数调用a中传递alocare(a, &n);未初始化。可以从函数返回指向动态分配的内存的指针。删除参数int *a并在a中将alocare声明为局部变量:

   int  *alocare(int *n)
   {
        printf("Introduceti numarul de elemente din sir");
        scanf("%d", n);
        // Local declaration of pointer a
        int *a = malloc(*n*sizeof(int)); 
        if (!a)
        {
            printf("Eroare la alocare\n");
            return 0;
        }
        return a;
}  

并将函数调用为

a = alocare(&n);