2015-10-30 5 views
0

Я создаю структуру с неопределенным размером.Как изменить размер структуры с помощью malloc

#define namemax 128 
struct Image{ 
    char name[namemax+1]; 
    int length; 
    double *array;   //double array[256] 
}; 
    struct Image* graph; 

    graph=malloc(max*sizeof(struct Image)); 

Если я определяю array[256], все работает нормально. , но если я использую double *array, а затем написать

graph[check].array = malloc(100 * sizeof(double *)); 

создает неисправность сегмента. Мне было интересно, как я могу определить размер, используя malloc и realloc для массива. Если я добавлю значение в массив, он показывает ошибку сегмента.

struct Image* graph;//outside the while loop 
 
while: //it is inside the while loop 
 
     //basically it read different name each line, and put the x and y to the array 
 
     graph[check].array = malloc(100 * sizeof(double)); 
 
\t  check++; 
 
\t  strcpy(graph[check].name,type); 
 
\t  graph[check].array[count]=shiftX; 
 
\t  graph[check].array[count+1]=shiftY;

+2

Ваш код является законным, но не гарантирует, что массив malloced «после» объекта, поэтому он фактически не увеличивает размер объекта. – John3136

+0

Вы на 32 бит? – alk

+2

** Как ** вы получаете SIGSEGV? 'graph [check] .array = malloc (100 * sizeof (double)); graph [check] .array [55] = 2.5; 'должен работать нормально - ** если предположить, что вызов' malloc() 'преуспевает. Опубликуйте больше кода. –

ответ

2

Это потому, что double * array объявляет указатель на массив, а не хранения. Здесь вы хотите объявить хранилище. Самый простой способ - просто определить массив как double array[1] и убедиться, что это последний элемент в структуре. Затем вы можете выделить пространство для структуры, используя malloc() и realloc(), передав им размер базовой структуры плюс размер массива (sizeof double * количество элементов массива).

+0

Объявление поля указателя в структуре, подобной 'double * array', тогда использование' malloc() 'для выделения памяти совершенно законно и не вызовет SIGSEGV сам по себе. Он не будет находиться в соседней памяти, но он не сработает сам по себе. Там больше происходит. –

+0

не работает – tobecalt

0

Одна проблема, которую я вижу, использует sizeof (double *) вместо sizeof (double), даже если оба они одинаковы, если вы используете архитектуру x86-64.

0

Я думаю, что он делает ошибку seg, потому что в malloc вы сказали sizeof(double *) (На самом деле вы объявляете массив массива). Просто попробуйте сказать sizeof(double) он может работать, но я не знаю, это точно, потому что я его не тестировал.

И, кстати, когда вы объявляете массив статически, вы резервируете место для него, когда вы объявляете свою структурную переменную, но когда вы объявляете ее как указатель (динамический массив), вы должны зарезервировать место для нее, и вы можете изменить размер массива. Вы должны использовать realloc google it.

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