函数内的动态内存分配不起作用,但没有发生错误[重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

我想为一系列字符分配内存。因此,我写了一个函数,返回值告诉我,如果我检查它,一切正常。但是当我尝试在数组中写入时,会发生分段错误。如果我分配内存whitout功能(sourcode的注释区域),一切似乎工作正常。

#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;
    }
}
c function dynamic-memory-allocation
1个回答
1
投票

array_alloc中,您要分配一个局部变量:

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

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

您需要更改函数以接受指向指针的指针,并从text_original传递main的地址。所以将功能更改为:

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);
© www.soinside.com 2019 - 2024. All rights reserved.