我真的束手无策了:)
我基本上试图建立一个 struct Foo,其中包含一个未确定大小的数组,然后使用单独的函数设置所述数组的值并打印它。然而,当我尝试打印时,我在 valgrind 中不断收到“条件跳转或移动取决于未初始化值”和“使用大小为 8 的未初始化值”错误。
这是代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Foo {
char *name;
int x;
int y;
int *array; //this is the problematic array
};
struct Foo *foo_maker(char *name, int x, int y, int array_size)
{
int array[array_size];
memset(array, 0, sizeof(array)); //initializing the array here, so why am i getting the errors?
struct Foo *a_foo = malloc(sizeof(struct Foo) + sizeof(array));
a_foo->name = name;
a_foo->x = x;
a_foo->y = y;
a_foo->array = array;
return a_foo;
}
void set_foo(struct Foo *a_foo, int array_size)
{
int i;
for(i = 0; i < array_size; i++)
a_foo->array[i] = 1;
}
void print_foo(struct Foo *a_foo, int array_size)
{
int i;
for(i = 0; i < array_size; i++)
printf("%d\n", a_foo->array[i]);
}
void foo_killer(struct Foo *a_foo)
{
free(a_foo);
}
int main(int argc, char *argv[])
{
char *name = argv[1];
int x = atoi(argv[2]);
int y = atoi(argv[3]);
int array_size = atoi(argv[4]);
struct Foo *foo = foo_maker(name, x, y, array_size);
set_foo(foo, array_size);
print_foo(foo, array_size);
foo_killer(foo);
return 0;
}
我不认为将 a_foo->array 作为参数传递给其他函数有问题,因为只有当我尝试打印数组时出现未初始化的错误时才会出现问题。我什至尝试在 foo_maker 和 set_foo 中打印数组,两次都得到了相同的错误。
如有任何帮助,我们将不胜感激:)
最佳答案
int array[array_size];
该内存驻留在本地函数堆栈上,一旦函数返回就不再存在。
a_foo->array = array;
一旦 foo_maker()
完成,将成为指向您不再拥有的内存区域的指针。
当您分配数组内存时,在分配 a_foo 时,您可能需要:
a_foo->array = a_foo + 1;
这是一种不寻常的指针算术,但会导致 a_foo->array 指向 a_foo 之后的内存。
如果你这样做的话会更容易理解:
int *array = malloc(sizeof(int) * array_size);
struct Foo *a_foo = malloc(sizeof(struct Foo));
a_foo->array = array;
关于c - 在结构体中打印任意大小的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32265747/