在结构内打印任意大小的数组

时间:2015-08-28 07:38:41

标签: c arrays struct

我真的在我的智慧结束:)

我基本上试图设置一个结构Foo,其中包含一个未确定大小的数组,然后有单独的功能设置所述数组的值并打印它。我一直在'有条件的跳跃或移动取决于未初始化的值'和'使用未初始化的大小为8'但是,当我尝试打印时,valgrind出错。

这是代码

#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-&gt;数组作为参数传递给其他函数是一个问题,因为只有当我尝试打印数组时才会出现未初始化的错误。我甚至尝试在foo_maker和set_foo中打印数组,两次都遇到了同样的错误。

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:0)

int array[array_size];

此内存驻留在本地函数堆栈中,并在函数返回后停止存在。

a_foo->array = array;

将成为foo_maker()完成后,您不再拥有的内存区域的指针。

在分配a_foo时分配数组内存时,您可能需要:

a_foo->array = a_foo + 1;

这是一种不寻常的指针算术,但会导致a_foo-&gt;数组在a_foo之后指向内存。

如果你这样做会更容易理解:

int *array = malloc(sizeof(int) * array_size);
struct Foo *a_foo = malloc(sizeof(struct Foo));
a_foo->array = array;