c - 在结构体中打印任意大小的数组

标签 c arrays struct

我真的束手无策了:)

我基本上试图建立一个 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/

相关文章:

c - 链接到 Pelles C 中的 DLL

c - GDB:观察给定范围内的变量

C:分配一个指针

c - printf() 打印整个数组

javascript - 在 JavaScript 中使用 for..of 迭代时从数组中删除元素应该是安全的吗?

c - C中的浮点舍入

php - 使用带有键的数组作为数组键

c - 打印素数的程序

c++ - 在 C++ 中如何为结构类型分配内存

c - 如何使用结构体?