这个问题在这里已有答案:
我想为一系列字符分配内存。因此,我写了一个函数,返回值告诉我,如果我检查它,一切正常。但是当我尝试在数组中写入时,会发生分段错误。如果我分配内存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;
}
}
在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);