Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中的函数中使用realloc_C_Arrays_Malloc - Fatal编程技术网

如何在C中的函数中使用realloc

如何在C中的函数中使用realloc,c,arrays,malloc,C,Arrays,Malloc,基于我在这里学到的知识: 这个很好用。但是,我也尝试在函数中使用realloc void increase(int data[]) { data = realloc(data, 5 * sizeof *data); } 这符合要求,但程序在运行时崩溃 问题 我应该如何在函数中使用realloc 我知道我应该将realloc的结果分配给一个变量,并首先检查它是否为NULL。这只是一个简化的示例。您想修改int*(您的数组)的值,因此需要将指向该值的指针传递到递增函数中: void

基于我在这里学到的知识:

这个很好用。但是,我也尝试在函数中使用
realloc

void increase(int data[])
{
    data = realloc(data, 5 * sizeof *data);    
}
这符合要求,但程序在运行时崩溃

问题

我应该如何在函数中使用realloc


我知道我应该将
realloc
的结果分配给一个变量,并首先检查它是否为
NULL
。这只是一个简化的示例。

您想修改
int*
(您的数组)的值,因此需要将指向该值的指针传递到
递增
函数中:

void increase(int** data)
{
    *data = realloc(*data, 5 * sizeof int);
}
调用代码将如下所示:

int *data = malloc(4 * sizeof *data);
/* do stuff with data */
increase(&data);
/* more stuff */
free(data);

请记住指针和数组之间的区别。
数组是堆栈中的内存卡盘,仅此而已。如果有数组:

int arr[100];
那么arr是内存的地址,但是&arr是内存的地址,内存的地址是恒定的,不存储在任何位置。所以不能说arr=NULL,因为arr不是一个指向某物的变量。它只是一个符号地址:数组开始的地址。相反,指针有自己的内存,可以指向内存地址

将int[]更改为int*,就足够了
此外,变量是通过copy传递的,因此需要向函数传递int**

关于如何使用realloc,所有教学示例包括:

  • 使用realloc
  • 检查是否为空。在这种情况下,请使用perror并退出程序
  • 如果不为空,则使用分配的内存
  • 当你不再需要时释放内存
  • 这是一个很好的例子:

    int* chuck= (int*) realloc (NULL, 10*sizeof(int)); // Acts like malloc,
                  // casting is optional but I'd suggest it for readability
    assert(chuck);
    for(unsigned int i=0; i<10; i++)
    {
        chunk[i]=i*10;
        printf("%d",chunk[i]);
    }
    free(chunk);
    
    int*chuck=(int*)realloc(NULL,10*sizeof(int));//像malloc一样行事,
    //铸造是可选的,但我建议它的可读性
    断言(查克);
    
    对于(unsigned int i=0;i这两个代码都是非常有问题的,如果您使用相同的指针从realloc发送和接收,如果失败,您将丢失指针以稍后释放它

    你应该这样做:

    { ...

    。。。


    }

    我不敢相信你没有对
    malloc()
    的返回值进行强制转换,而且你还正确地使用了
    sizeof()
    操作符…太棒了!+1.欢迎。信不信由你,每次我遇到标记为
    c
    的问题时,我都(而且必须)准备好应付类似
    char*p=(char*)malloc(len*sizeof(char)这样的混乱局面;
    ,这至少在3个地方是错误的(练习:找出位置)。@H2CO3-冒着听起来像傻瓜的风险:1.在malloc之前的演员阵容是没有必要的,2.sizeof*p相当于sizeof(char),在更改类型时更有用,3.它缺少一个右括号“?哦,那么它是4!是的,我确实错过了右括号(第0个错误)第一个:勾选,第二个:由于
    sizeof(char)
    始终为1,这会造成混乱并降低可读性,第三个:如果您使用
    sizeof()
    ,您应该真正使用
    sizeof(*variable)
    而不是
    sizeof(type)
    ,因为当您更改
    *p
    的类型时,后者将中断。啊,我对编程比较陌生,没有意识到它是sizeof(char)的标准1.今天学到了一些东西。感谢有趣的练习!+1软件内存泄漏!如本文所述,您需要使用临时指针来检查realloc返回值。如果realloc失败,我可以继续使用realloc而不是释放它吗?
    int* chuck= (int*) realloc (NULL, 10*sizeof(int)); // Acts like malloc,
                  // casting is optional but I'd suggest it for readability
    assert(chuck);
    for(unsigned int i=0; i<10; i++)
    {
        chunk[i]=i*10;
        printf("%d",chunk[i]);
    }
    free(chunk);
    
    more = realloc(area , size);
    if( more == NULL )
        free(area);
    else
        area=more;