2015-08-28 2 views
0

Я действительно в моем конце остроумия здесь :)печать произвольного размером массивов внутри структуры

я в основном пытаюсь создать структуры 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-> массив в качестве параметра других многочисленных функций, так как это только тогда, когда я пытаюсь напечатать массив, когда я получить неинициализированные ошибки. Я даже попытался напечатать массив внутри foo_maker и set_foo, и оба раза я получил ту же ошибку.

Любая помощь будет оценена :)

ответ

0
int array[array_size]; 

эта память хранится на локальном стеке функции и перестает существовать, как только функция возвращает.

a_foo->array = array; 

будет указатель на область памяти, больше не самостоятельно, как только foo_maker() делается.

Как выделить память массива, хотя при выделении a_foo, вы можете:

a_foo->array = a_foo + 1; 

который является своего рода необычным арифметика указателей, но приведет к a_foo-> массив, указывающий на память после a_foo.

Было бы более понятно, хотя, если вы:

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

спасибо! поэтому, если я использовал malloc для настройки массива, а затем назначил его массиву a_foo->, это сработает? Я смущен, потому что я думал, что использовать нотацию «a_foo-> array» состоит в том, что я могу назначать ему значения, и она будет придерживаться даже в том случае, если вне стеков, так как «a_foo-> array» указывает на область в куче? – drunkenlollipop

+0

Вы также можете посмотреть 'calloc', который предназначен для инициализации блоков памяти, выделенных для' 0'. В ситуациях с массивами это предотвращает непреднамеренную попытку чтения из неинициализированного значения. –

+0

Вам нужно выделить память 4 байтов указателя 'int * array' в' struct foo' и память, на которую указывает указатель. Значение указателя, память от _where, указывающего на другую память, будет находиться вне функции. Но область памяти, которую вы _point at_ перестает существовать, потому что область памяти является частью стека функций, если вы просто делаете int array [array_size]; –

Смежные вопросы