2015-02-17 4 views
1

Как передать массив структур?Передача массива структур

До сих пор у меня есть это, который является глобальным:

typedef struct _line 
{ 
    float val1; 
    int val2; 
} line; 

Затем я прочитал данные из файла в этой структуре

struct _line* read_file() 
{ 
    typedef struct _line *Lines 
    Lines *array = malloc(num_lines * sizeof(Lines)); 
    //read values into structures here 

Тогда я завалить структуры в массиве со значениями. Если я printf("%d", (*array[1]).val1); я получить правильное значение здесь, в этом конкретном методе

Затем я возвращаюсь массив как так

return *array 

Но когда я делаю это, только 0th структура правильно читает в методе я вернулся , Чтение 1-го элемента просто печатает случайные значения. Что я делаю неправильно?

+1

По вашему (на маленьком) коде и описанию вы даже не сможете скомпилировать код. Создайте [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и покажите нам. –

+2

Кроме того, при распределении памяти с помощью 'malloc' содержимое * неопределенно * до тех пор, пока вы его не инициализируете, а также по своему неопределенному описанию вы не инициализируете всю выделенную память. Существует также проблема выделения множителя 'sizeof (Lines)', но 'sizeof (Lines)' дает вам размер * указателя *, а не структуру, вместо которой вы хотите 'sizeof (* array)' (Урок здесь: не используйте псевдонимы типов указателей). –

+0

остановить использование указателя typedefs. Ваш malloc ошибочен. –

ответ

0

Вы не должны разыменовать массив, когда вы вернуть его , это на самом деле несовместимого типа с типом возвращаемого функцией, просто

return array; 

также убедитесь, что array != NULL после malloc() перед чтением значения, и вам действительно не нужен typedef, что делает ваш код немного запутанным.

Если ваш код скомпилирован, и я сомневаюсь, тогда у вас нет предупреждений, включенных в вашей команде компилятора, включите их, чтобы предотвратить такую ​​проблему.


(1) *array эквивалентно array[0].

0

Расширение на мои комментарии, ваш код (как вы описали и показать его) у вас есть undefined behavior:

Это потому, что вы выделяете массив указателей, но по-видимому, не выделяют указатели в этом массиве , Поэтому, когда вы разыскиваете указатель (который вы не выделили и значение которого неопределенно, и поэтому укажет на кажущееся случайное местоположение), у вас есть это неопределенное поведение.

Вместо того, чтобы использовать типовой псевдоним, как Line использовать имя структуры, как

struct _line *array = malloc(num_lines * sizeof(*array)); 

Это выделит num_linesструктуры (вместо указателей), а затем использовать его как обычный массив, без указателя разыменования

array[x].val1 = something; 

И вы, конечно, вернуть этот указатель array как есть:

return array; 
Смежные вопросы