我需要将一系列结构传递给一个函数,这是我的理解是,我必须为整个结构以及每个构造中的每个单独的结构成员分配内存在数组内的结构。
我完成的方式导致Valgrind的写入错误(在函数read_file中的第二行引起)导致了无效的写入错误。怎么了?
typedef struct test
{
char *string1;
int num1;
int num2;
char *string2;
} Test;
static void read_file(Test *test)
{
test = (Test *)calloc(16, sizeof(test));
test[0].string1 = (char *)calloc(strlen("hello") + 1, sizeof(char));
}
int main(void)
{
int i = 0;
Test test[16];
for (i = 0; i < 16; i++)
{
memset(&test[i], 0, sizeof(test[i]));
test[i] = (Test) { "", 0, 0, "" };
}
read_file(test);
return 0;
}
ps:我知道我必须释放分配的内存,但首先我想使上述代码正常工作。
main
中的test
数组已经为其分配了内存。
您然后将其传递到read_file
函数中,因此您无需再次分配内存。删除此:
test = (Test *)calloc(16, sizeof(test));
顺便说一句,您可能打算在那里使用sizeof(Test)
(或sizeof(*test)
)。sizeof(test)
与sizeof(Test*)
相同,几乎肯定比sizeof(Test)
小。
Test *test
read_file
功能内部的test
变量是测试结构的pointer
。
sizeof(test)
这等于指针的尺寸。
test = (Test *)calloc(16, sizeof(test));
这将16 指针的内存分配给Test
结构。这不是为16个结构分配内存,而仅对指针为其分配。
test[0].string1 =
是无效的,不确定的行为发生。由于sizeof(test)
比sizeof(Test)
要小,因此没有足够的内存来访问test0[].string1
。因此,这将访问内存"超出边界",因此访问无效/不是分配的内存区域。当您尝试写入它(您正在做一个评估)时,表达是无效的,并且不确定的行为发生。Valgrind正确地检测到"写入错误" - 您尝试写入您不拥有的内存。