所以我有这个功能:
source_t * source_init(char * argsource)
{
source_t * temp = (source_t *) malloc(sizeof(source_t *));
temp->path = realpath(argsource, NULL);
temp->dir = dirname(temp->path);
temp->name = basename(temp->path);
temp->ext = strrchr(temp->name, '.');
temp->content = read_file(temp->path); // here
temp->error = error_free();
return temp;
}
它正在调用函数read_file()
:
char * read_file(char * sourcepath)
{
char * buffer = NULL;
long string_size, read_size;
FILE * file = fopen(sourcepath, "r");
fseek(file, 0, SEEK_END);
string_size = ftell(file);
rewind(file);
buffer = (char *) malloc(sizeof(char) * (string_size + 1) );
read_size = fread(buffer, sizeof(char), string_size, file);
buffer[string_size] = '\0';
if (string_size != read_size)
{
free(buffer);
buffer = NULL;
}
fclose(file);
return buffer;
}
并出现此错误:malloc: *** error for object 0x7faf08402698: incorrect checksum for freed object - object was probably modified after being freed.
所以我当前的解决方案是在主函数中调用content
之后单独初始化source_init()
。虽然该解决方案有效,但我希望在content
中初始化source_init()
。此外,我似乎无法直接调用source_init()
来初始化content
,因为出现了相同的错误,所以我必须创建一个缓冲区来调用source_init()
并初始化content
到缓冲区
答案 0 :(得分:5)
这可能不是你想要做的:
source_t * temp = (source_t *) malloc(sizeof(source_t *));
将指针的空间分配给source_t对象,也不分配给source_t对象。
另外,在C中你不应该转换malloc的返回值。这样做可以隐藏错误,并使它们很难找到。
答案 1 :(得分:2)
malloc
,calloc
或realloc
。这只是掩盖潜在的错误sizeof(<data type>)
。它很容易出错,并且会使你的代码重新分解成为****的痛苦。改为使用
source_t *temp = malloc(sizeof *temp);
这样做的好处是sizeof *temp
返回正确的字节数,你不必考虑正确的类型(比如当你处理双/三指针时),如果你需要更改数据类型,让我们说source2_t
,然后您只需要更改变量的类型,而不必担心可以轻易忽略的令人讨厌的sizeof(<data type>)
。
答案 2 :(得分:-1)
在malloc()行的source_init()中,你有一个错误。
它应该是:
source_t * temp = (source_t *) malloc(sizeof(source_t));
而不是:
source_t * temp = (source_t *) malloc(sizeof(source_t *));