2015-11-19 3 views
0
typedef struct { 
    double *x; 
    int points; 
} Polygon; 



polygon[cc].points = readobject(polygon[cc].file); //lets say equals 15 
polygon[cc].x = (double *) malloc(polygon[cc].points * sizeof(double)); 

printf("%d\n", sizeof(polygon[cc].x)/sizeof(polygon[cc].x[0])); 
//This prints out on 1 

Я тест инициализирует x как x[100] и он работает тогда, но не если malloc() вызов установлен массив в STRUCT по адресу x[15]? Это просто измерение байтов двух double s?Почему мой размер (arr)/sizeof (arr [0]) = 1?

+0

Что вы получите с помощью 'polygon [cc] .x [0]'? x не является массивом ... – Claudio

+3

Вызов 'sizeof' на динамически выделенный массив просто вернет размер указателя в байтах, а не размер всего массива. – sgarizvi

+0

'float x [15]' это совсем другое дело от 'float * x = malloc (15 * sizeof (float))' Также, [не выдавать результат 'malloc'] (http: // stackoverflow. ком/вопросы/1565496/специфично, Что-опасно-о-литейно-заместитель на результат из-таНоса). –

ответ

6

В коде

polygon[cc].x 

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

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

В вашем случае sizeof(double *) равно sizeof(double), так что вы получите результат в виде 1.

+0

Если я хочу получить размер всего массива, как бы я мог назвать это вместо указателя? – af3ld

+0

@ af3ld Как я уже упоминал, указатель не является массивом. Если вы выделяете память указателю, а затем вы хотите получить размер выделенной памяти, вы не сможете получить эту информацию с этого указателя. Вам может потребоваться сохранить выделенный размер отдельно и передать его. –

+1

Хорошо. Спасибо за помощь – af3ld

1

Тип polygon[cc].x является double *, тип polygon[cc].x[0] является double.

Бывает, что на тестируемом компьютере указатели и парные номера имеют одинаковый размер (8 байтов).

Оператор sizeof ничего не знает о вызове malloc() (это не его бизнес); выражения sizeof в коде, который вы опубликовали, оцениваются во время компиляции.

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