c - 函数内的动态内存分配不起作用,但没有发生错误

标签 c function dynamic-memory-allocation

<分区>

我想为一个字符数组分配内存。因此,我编写了一个函数,返回值告诉我,如果我检查它,一切正常。 但是当我尝试在数组中写入时,会发生段错误。 如果我在没有函数的情况下分配内存(源代码的注释区域),一切似乎都工作正常。

#include <stdio.h>
#include <stdlib.h>
#define ENWIK8 100000000
#define FILEPATH_INPUT "enwik8"
#define FILEPATH_OUTPUT "ergebnis/enwik8"

int array_alloc(char* array, int size);
int array_fill(FILE* file, char* path, char* array);

int main()
{

    FILE* enwik8_file;
    char *text_original;
    array_alloc(text_original, ENWIK8);

//THIS CODE WOULD WORK BUT NOT THE FUNCTION WITH SAME CODE
//   text_original = calloc(ENWIK8,sizeof(char));
//        if(text_original == NULL)
//        {
//            perror("Allocating array not possible!");
//            return -1;
//
//        }

    //Leads to: segmentation fault, if the function is used 
    //instead of the code above
    text_original[1000000] = 'a';
    return 0;
}



int array_alloc(char* array, int size)
{

    array = (char*)calloc(size,sizeof(char));
    if(array == NULL)
    {
        perror("Allocating array not possible!");
        return -1;

    }
    else
    {
        return 0;
    }
}

最佳答案

array_alloc 中,您正在分配给局部变量:

array = (char*)calloc(size,sizeof(char));

array 的任何更改仅在此处可见,不会反射(reflect)在调用函数中。因此,在 array_alloc 返回后,text_original 仍未初始化。然后您读取并取消引用调用未定义行为的无效指针,在这种情况下会导致您的程序崩溃。

您需要更改函数以接受指向指针的指针,并从main 传递text_original 的地址。所以把函数改成这样:

int array_alloc(char **array, int size)
{
    *array = calloc(size, 1);
    if (*array == NULL)
    {
        perror("Allocating array not possible!");
        return -1;   
    }
    return 0;
}

然后这样调用它:

array_alloc(&text_original, ENWIK8);

关于c - 函数内的动态内存分配不起作用,但没有发生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54739475/

相关文章:

javascript - 我如何更好地重新排序我的 javascript 代码?

C++ 容器 : Optimal Memory Management

c - 使用 realloc 缩小

计算行数、单词数和字符数

c - 子进程的 GDB 回溯

c++ - 如何在 Bazel 构建命令期间传递标志,例如 -DVERBOSE?

sql - "Execute does not exist"写入 Postgres 函数时

javascript - 我的JS在将ascii转换为字符串时添加一个空格

可变长度的字符

c - LPC1769 FIOPIN 如何工作?