2015-11-17 1 views
0

У меня есть эти структуры:Количество элементов в динамическом массиве структур

typedef struct g { 
    int i; 
    float f; 
}Txy; 

typedef struct s { 
    Txy *x; 
}Tstruct; 

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

Tstruct s; 

s.x = (Txy*)realloc(s.x, sizeof(Txy)); 

После того как я добавлю некоторые элементы в массив, мне нужно выяснить, сколько элементов находится в массиве в тот момент.

int num = sizeof(s.x)/sizeof(s.x[0]); 

Я пробовал это, но он не работает. Что может быть проблемой?

+1

'SizeOf (s.x)' === размер указателя. –

+0

Вы используете funcionts? – ameyCU

+2

@SouravGhosh Эй, можете ли вы прекратить публикацию этой темы по вопросам, когда она не имеет никакого отношения вообще, и просто отвлекает от реальной проблемы? – this

ответ

1

Проблема с использованием sizeof указателя заключается в том, что вы получаете размер указателя, а не то, на что он указывает.

Если вам нужен размер, вам нужно отслеживать его самостоятельно. Добавление поля члена к Tstruct структуры для него, что-то вроде

typedef struct s { 
    Txy *x; 
    size_t size; // size of x 
}Tstruct; 

Это до вас, чтобы решить, если вы хотите размер быть количество элементов или размер в байтах выделенной памяти.

1

Вы забыли указать новое количество элементов:

s.x = (Txy*)realloc(s.x, sizeof(Txy) * numElements); 
+0

Если я хочу добавить только один элемент, то размер sizeof (Txy) достаточно? Или мне нужно добавить sizeof (Txy) * (current_number_of_elements + 1) – sykatch

+0

, в этом случае этого будет достаточно, поскольку число элементов равно 1 .. –

+0

Я все еще не уверен в realloc. Его второй аргумент «размер» означает, что размер нового блока памяти будет old_size + 'size' или размер нового блока будет просто «размером»? – sykatch