2014-12-14 3 views
1

Я играю со структурами и нашел способ назначить экземпляры структурных идентификаторов типа int.Создание экземпляров структуры в перспективе?

struct test{ 
int x; 
int y; 
} 

assign(struct test *instance, int id, int x2, int y2) 
{ 
(instance+id)->x = x2; 
(instance+id)->y = y2; 
} 

print(struct test *instance, int id) 
{ 
printf("%d\n", (instance+id)->x); 
} 


main() 
{ 
struct test *zero; 
assign(zero, 1, 3, 3); 
print(zero, 1); 
} 

При выполнении этого кода он делает то, что должен, но это дает мне уведомление о недостатке сегментации. Что я могу сделать по этому поводу?

+0

примечание '(экземпляр + идентификатор) -> x' ==' экземпляр [ID] .x' –

+0

три вещи ошибочны в main() 1) правильный синтаксис - это «int main()» 2) передача «1» приведет к установке второй записи в «ноль», I.E. пропуская первую запись. 3) в настоящее время «ноль» указывает на «ничего особенного» I.E. он должен указывать на некоторую выделенную память, например: struct test * zero = malloc (2 * sizof (struct test)); Затем проверьте возвращаемое значение из malloc(), чтобы убедиться, что операция прошла успешно. Затем сделайте вызов для назначения(). Примечание: обязательно позвоните бесплатно (ноль); перед выходом из программы, чтобы избежать утечки памяти. – user3629249

ответ

4

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

Вы можете использовать «автоматическое хранение»:

// You can't change COUNT while the program is running. 
// COUNT should not be very large (depends on platform). 
#define COUNT 10 

int main() 
{ 
    // Allocate memory. 
    struct test zero[COUNT]; 

    assign(zero, 1, 3, 3); 
    print(zero, 1); 

    // Memory automatically freed. 
} 

Или вы можете использовать «динамическую память»:

#include <stdlib.h> 

int main() 
{ 
    int count; 
    struct test *zero; 

    // You can change count dynamically. 
    count = 10; 

    // Allocate memory. 
    // You can use realloc() if you need to make it larger later. 
    zero = malloc(sizeof(*zero) * count); 
    if (!zero) 
     abort(); 

    assign(zero, 1, 3, 3); 
    print(zero, 1); 

    // You have to remember to free the memory manually. 
    free(zero); 
} 

Однако, вы должны помнить, чтобы поместить возвращаемые типы ваших функций ... оставляя их напоминает C с 1980-х годов ...

void assign(struct test *instance, int id, int x2, int y2) 

void print(struct test *instance, int id) 
+0

То, что я пытаюсь сделать, это создать несколько структур, чтобы пользователь мог, например, ввести ID 3 и присвоить значения атрибутам, как в базе данных. Не существует способа создать бесконечные структуры, пока программа уже запущена? – user3698990

+0

@John: Связанные списки не нужны. Массивы прекрасны. –

+0

Да, но вам нужно следить за тем, что у вас есть во всех случаях вовремя, и нужно ли вам «realloc» получить больше. Просто создайте начальную сумму '#define NSTRUCT 256', затем выделите много указателей' struct test ** mytest = calloc (NSTRUCT, sizeof (* mytest)); 'тогда, когда вам нужна структура, выделите' mytest [0] = calloc (1, sizeof (** mytest)); 'Добавьте по мере необходимости' 1,2,3..', пока не достигнете 'NSTRUCT-1', а затем' realloc' в '2 * NSTRUCT' и продолжайте движение. Это один сплошной подход к тому, чтобы иметь столько, сколько вам нужно. –

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