【问题标题】:How can I allocate memory for array inside a function如何为函数内的数组分配内存
【发布时间】:2015-12-21 20:02:04
【问题描述】:

我正在尝试从用户那里接收一个号码。 并创建一个具有该数字的数组,但是在函数内部。 这是我的几次尝试,我遇到了运行时错误。 非常感谢您的帮助。

#include <stdio.h>
#include <stdlib.h>
int* Init(int* p, int num);
int main() {
    int *p;
    int num, i;
    puts("Enter num of grades:");
    scanf("%d", &num);

    Init(&p, num);
    //for (i = 0; i < num; i++)
    //{
    //  scanf("%d", &p[i]);
    //}
    free(p);
}
int* Init(int* p, int num)
{
    int *pp;
    p = (int *)malloc(num*sizeof(int));
    if (!pp)
    {
        printf("Cannot allocate memory\n");
        return;
    }
    p = pp;
    free(pp);
}

【问题讨论】:

  • 您遇到运行时错误?我收到 6 个编译器警告!请注意他们。
  • 对我来说似乎是重复的。

标签: c arrays memory dynamic


【解决方案1】:

到目前为止,您已经做得很好了,您需要将指针传递给指针。但是您的函数签名不需要int **。要么将指针传递给指针并将分配的内存存储在其中:

void Init(int **pp, int num)
{
    int *p;
    p = malloc(num*sizeof(int));
    if (!p)
    {
        printf("Cannot allocate memory\n");
    }
    *pp = p;
}

并检查Init() 是否返回正确的指针:

   Init(&p, num);
   if(p == NULL) {
      /*Memory allocation failed */
   }

或者分配内存并返回指针:

int* Init(int num)
{
    int *p;
    p = malloc(num*sizeof(int));
    if (!p)
    {
        printf("Cannot allocate memory\n");
    }

    return p;
}

main() 调用为:

int * p = Init(num);
if(p == NULL) {
   /*Memory allocation failed */
}

相应地更改Init()的原型。

在任何情况下,你都不能free()Init()中的指针。这只是立即取消分配内存,您将得到dangling pointer

完成后你需要在main()free()

【讨论】:

  • 1) void Init(int *pp, int num) { ... int *p; ... *pp = p; }??你的意思是void Init(int **pp, ...? 2) malloc(num*sizeof(int)); 可能在n==0 时返回NULL,并且不是内存不足的情况。
  • @chux 感谢您指出。我现在重写了部分,让调用者决定在 malloc() 返回 NULL 时要做什么。
【解决方案2】:
int *pp;
p = (int *)malloc(num*sizeof(int));
if (!pp) /* pp is used uninitialized at this point */

int *p;
int num, i;
puts("Enter num of grades:");
scanf("%d", &num);
Init(&p, num);
free(p); /* p is used uninitialized at this point */

如果你想在另一个函数中为指向int的指针分配空间,你需要传递一个指向指针的指针:

...
Init(&p, num);
...
int Init(int **pp, int num)
{
    *pp = malloc(num * sizeof(int));
    ...

【讨论】:

    【解决方案3】:

    首先,您需要修复函数的原型。应该是

    int* Init(int** p, int num);  
    

    然后修复函数定义

    int* Init(int** p, int num)
    {
        //int *pp;   // You don not need this variable
        *p = malloc(num*sizeof(int));   // Allocate memory
        if (!*p)
        {
            printf("Cannot allocate memory\n");
            return NULL; // Return a NULL pointer
        }
    
        return *p;
    }  
    

    【讨论】:

      【解决方案4】:

      您的代码中有一些拼写错误,

      p = (int *)malloc(num * sizeof(int));
      

      应该是

      pp = (int *)...
      

      您的free(pp); 主要是导致它无法工作的原因,您不想调用它,否则您分配的内存将不会被保存。此外,在函数调用结束时,作为Init 的方法参数,pp 的内存本质上是“丢失”的,p 是一个值副本,不是对mainp 版本的精确引用,因此当 Init 返回时,对p 的更改“丢失”。

      只需执行:p = Init(); 和 init return pp;

      经验: 这行p = pp,设置变量p 指向pp 分配的内存,因此pp 的空闲也是p 的空闲。 我不确定将地址返回到内存是否总是被认为是好的做法,因为您必须确保它被释放,但对于您的程序来说它会起作用。

      【讨论】:

        【解决方案5】:

        知道您的函数不会修改您的指针 (*p),**p 丢失并且 *p 在 Main 函数中没有有效且已知的内存地址,这一点非常重要。

        为了安全地分配内存,我建议使用这两个函数。

        void init(int **p,int number){
            *p =  malloc(number*sizeof(int));
        }
        

        如果你希望你的函数返回分配的指针,你可以这样做:

        int* init(int number){
            int* p = malloc(number*sizeof(int));
            return p;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-18
          • 2018-02-06
          • 2021-07-24
          • 2020-02-03
          • 2021-11-15
          • 1970-01-01
          • 1970-01-01
          • 2020-10-23
          相关资源
          最近更新 更多