2013-09-18 3 views
0

Как создать массив структур динамически?динамическое создание массива структур

struct arr 
{ 
    int a; 
    float b; 
} *p; 

p = (struct arr *)malloc(2*sizeof(struct arr)); 

for (i = 0; i < 2; i++) 
{ 
    scanf("%d %f", &p[i]->a, &p[i]->b); 
} 

for (i = 0; i < 2; i++) 
{ 
    printf("%d %f", p[i]->a, p[i]->b); 
} 

Этот код не работал и не производил ошибок. Я редактировал зсапЕ этому

scanf("%d %f",&(&p[i])->a,&(&p[i])->b); 

и Printf этому

printf(("%d %f",(&p[i])->a,(&p[i])->b); 

, и она работала, но я не знаю, что именно происходит.

+1

'SizeOf (2 * struct arr) 'недействителен. Вы хотите '2 * sizeof (struct arr)' – lurker

+0

Хороший catch @mbratch. Это тоже вызовет UB. –

ответ

3

p[i] эквивалентен *(p + i). Существует операция разыменования. Это означает, что вы не хотите использовать ->. Просто используйте . доступ к полям:

scanf("%d %f", &p[i].a, &p[i].b); 
printf("%d %f",p[i].a, p[i].b); 

Ваше решение эквивалентно, но намного сложнее. a.b просто оказывается таким же, как (&a)->b.

+0

Почему это было ниспровергнуто? –

+0

Некоторые люди рывками. ;-) –

+0

Я думал о массиве как adt и думал, что его реализация является абстрактной для меня. – mrigendra

1

Как правильно указано @CarlNorum, вы разыскиваете адрес p через p[i], но затем с помощью конструкции указателя на элемент структуры. Вы хотите .. И исправить sizeof как я заметил:

struct arr 
{ 
    int a; 
    float b; 
} *p; 

int i; 

p = malloc(2*sizeof(struct arr)); 

for (i = 0; i < 2; i++) 
{ 
    scanf("%d %f", &p[i].a, &p[i].b); 
} 

for (i = 0; i < 2; i++) 
{ 
    printf("%d %f\n", p[i].a, p[i].b); 
} 
1

Следующее выражение является подозрительным, скорее всего, недопустим:

malloc(sizeof(2 * struct arr)); 

Вы, вероятно, означает это вместо:

malloc(2 * sizeof(struct arr)); 

Я думаю, что это легко чтобы понять, почему.

Кроме того, если p является struct arr*, p[i] является struct arr, так что вам нужно ., а не -> доступ к своим членам:

scanf("%d %f", &(p[i].a), &(p[i].b)); 

И:

printf(("%d %f", p[i].a, p[i].b); 
Смежные вопросы