【问题标题】:Function can not allocate memory for a pointer in C [duplicate]函数无法为C中的指针分配内存[重复]
【发布时间】:2019-04-03 12:12:40
【问题描述】:

我有一个名为“visitor”的结构,我想编写一个函数,为指向该结构的指针分配内存......

此代码有效:

visitor *visitorPtr = NULL;
int visitorCounter = 0;
visitorPtr = realloc(visitorPtr, ((visitorCounter++) * sizeof(visitor)));

但现在我想把这个功能放到一个函数中

void getMoreSpace(void *ptr, unsigned int counter)
{
    counter++;
    ptr = realloc(ptr, counter * sizeof(visitor));

    if (ptr == NULL)
    {
        printf("\n Error allocating memory! \n");
        return EXIT_FAILURE;
    }
}

//Call in MAIN:
getMoreSpace(visitorPtr, visitorCounter);

不幸的是,它似乎不起作用,因为我无法为该指针创建数据并在为该结构创建数据时出现此错误: My-C-Project.exe 中的 0x0FDAE559 (ucrtbased.dll) 抛出异常:0xC0000005:访问冲突写入位置 0x00000000。

【问题讨论】:

  • 您了解以下概念:按值调用和按引用调用吗?
  • 您修改的是 local 变量,而不是调用者的变量。所以调用者看不到变化。按照 Sourav Gosh 的建议查找按值调用和按引用调用。
  • 对我来说,如果在函数之后 var 仍处于更改状态,则按引用调用意味着
  • call-by-reference 对我来说意味着如果在函数之后 var 仍处于更改状态 以及 C 如何传递变量...
  • 通常总是按值,如果您使用指针,则按引用! :-)

标签: c pointers realloc


【解决方案1】:

visitorPtr 作为值传递给getMoreSpace 函数。因此,函数内对ptr 所做的任何更改都不会更新main 中的vistorPtr

您需要的是通过引用调用该函数,如下所示。

void getMoreSpace(void **ptr, unsigned int counter)
{
    counter++;
    *ptr = realloc(*ptr, counter * sizeof(visitor));

    if (*ptr == NULL)
    {
        printf("\n Error allocating memory! \n");
    }
}

您从main 拨打电话如下。

getMoreSpace(&visitorPtr, visitorCounter);
if (visitorPtr)
   ...do stuff....

【讨论】:

  • 我觉得不错。
猜你喜欢
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 2016-02-21
  • 2015-08-22
  • 2016-10-23
相关资源
最近更新 更多