2016-06-27 2 views
1

Я смущен относительно того, как сделать массив структур. Вот мой код:Как создать массив структур

#include <stdio.h> 
#include <stdlib.h> 

typedef struct line 
{ 
    int x; 
} *line; 

int main() 
{ 
    line *array = malloc(10 * sizeof(line)); 

    int i = 0; 

    for(i; i < 2; i++) 
    { 

     array[i]->x = 5; 
    } 

    for(i; i < 2; i++) 
    { 
     printf("%d\n", array[i]->x); 
    } 

    return 0; 
} 

Моя путаница происходит из следующих действий: В моем понимании, если у вас есть ЬурейеЕ и дать ему имя указателя, например * линии, то вы можете получить доступ и мутируют каждый элемент структуры, используя символ ->. Кажется, я не понимаю, почему и почему.

Моя ошибка:

вина Сегментация (ядро сбрасывали)

ответ

5

Вы typedefline как указатель на структуру, а не сама структура. Поэтому, когда вы набрали -ed на основе sizeof line, у вас есть место для десяти указателей, а не десять экземпляров структуры. Удалите * до line в typedef, поэтому вы получите массив структур, а не массив (нераспределенных) указателей на struct. После индексирования указателя вы должны использовать обычный точечный доступ.

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

0

Вы почти есть, вам просто нужно настроить либо синтаксис или выделить больше памяти для каждой структуры:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct line 
{ 
    int x; 
} *line; 

int main() 
{ 
    line *array = malloc(10 * sizeof(line)); 

    int i = 0; 

    for(i; i < 2; i++) 
    { 
     // XXX HERE YOU ALLOCATE MORE MEMORY 
     array[i] = malloc(sizeof array[i]); 
     array[i]->x = 5; 
    } 
    // XXX RESET "i" TO ZERO 
    for(i=0; i < 2; i++) 
    { 
     printf("%d\n", array[i]->x); 
    } 

    return 0; 
} 

Вы также никогда не сбросить переменную индекса i массив перед повторным использованием.

1

Здесь, установил ее для тебя:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct line 
{ 
    int x; 
} Line; 

int main() 
{ 
    Line* array = malloc(10 * sizeof(line)); 

    int i = 0; 

    for(i; i < 2; i++) 
    { 

     array[i].x = 5; 
    } 

    for(i; i < 2; i++) 
    { 
     printf("%d\n", array[i].x); 
    } 

    return 0; 
} 
+0

Это было бы лучшим ответом без разговорного первого предложения, а также с объяснением того, что вы изменили и почему это важно. Нотация 'for (i; i <2; i ++)' тоже не хороша, хотя она скопирована из вопроса - особенно для второго цикла, который вызывает неопределенное поведение, поскольку он обращается к неинициализированным данным. Если вы не собираетесь ничего делать в части инициализации, оставьте его пустым, но лучше всегда использовать 'for (i = 0; i <2; i ++)' или даже (C99 или новее) 'for (int i = 0; i <2; i ++) 'и отказаться от определения' i' вне петель. –

+1

@JonathanLeffler была переменной индекса 'i' той же причиной для downvote в моем ответе? Помимо упоминания этого или, возможно, более подробного ответа, я не вижу в этом ничего плохого. – tijko

+0

Не мой голос. Но мои комментарии стоят. –

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