2016-11-10 5 views
1

Я программировал на C++ некоторое время, но я просто учился C. Я пытался выполнить следующий код, пытаясь понять поведение realloc Это моя strctureИспользование realloc в этом коде - Размер моего массива не увеличивается

struct foo{ 
int a; 
int b; 
}; 

и это, как я использую it.Initially Я хочу, чтобы создать массив размером 2. (Что я управляю делать). Затем я хотел бы увеличить размер одного и того же массива до 3, сохраняя его предыдущий контент, поэтому я использую realloc. Это мой код

//Create array of size 2 
struct foo* farry = malloc(2 * sizeof(struct foo)); 
farry[0].a =1; 
farry[1].a =2; 
for(i=0 ; i<=(sizeof(farry)/sizeof(farry[0])) ; i++) 
{ 
    printf("Value %d \n",farry[i].a); 
} 


printf("-----Increasing the size of the array \n"); 
//Increase the size 
int oldsize = sizeof(farry)/sizeof(farry[0]); 
farry = realloc(farry, (oldsize+1) * sizeof(struct foo)); 
printf("new size is %d \n",sizeof(farry)/sizeof(farry[0])); 
farry[2].a =3; 
for(i=0 ; i<=(sizeof(farry)/sizeof(farry[0])) ; i++) 
{ 
    printf("Value %d \n",farry[i].a); 
} 

Это выход, который я получаю

Value 1 
Value 2 
-----Increasing the size of the array 
new size is 1 
Value 1 
Value 2 

Я ожидал, что новый размер будет 3 и печать 1,2,3, но его новый размер 1 почему? Старый размер и новый размер одинаковы в вышеуказанных case.I был бы признателен, если кто-то может объяснить, что я, возможно, отсутствует или делаю неправильно

ответ

0
struct foo* farry = malloc(2 * sizeof(struct foo)); 
... 
int oldsize = sizeof(farry)/sizeof(farry[0]); 

sizeof(farry)/sizeof(farry[0]) дает размер указателя/размер от структуры, а не от количества элементов.

+0

На самом деле это может быть ноль, если я не ошибаюсь. Можете ли вы объяснить, что он может работать иногда (когда используется как: 'struct foo farry []') –

+0

Да, и я читаю здесь http://stackoverflow.com/questions/15929869/count-the-number-of-elements-in -an-array-in-c, что невозможно получить никаких элементов в массиве, если это указатель. Я не уверен, как программисты C справляются с такой ситуацией? Я имею в виду в случае strcuture, как создать массив из 2 элементов? это 'malloc (2 * sizeof (struct foo)); 'даже правильно? –

+0

@JamesFranco Вы хотите сохранить число 'struct foo' в 'farry' в отдельной переменной (или отдельной' struct') или использовать структуру данных, такую ​​как связанный список. Да, это правильно, хотя соглашение состоит в том, чтобы использовать 'sizeof (* farry)', поэтому, если тип 'farry' будет когда-либо изменен, у вас будет меньше кода для поддержки. – yano

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