2013-08-31 4 views
-1

UPDATE: Я изменил статический массив для динамичного, но я все еще получаю ошибку нарушения сегмента, хотя затмение говорит:Изменение размера статического массива в C

*** glibc detected *** (path to file) double free or corruption (!prev): 0x00000000004093d0 *** 

StructHashTable является ЬурейиМ ...

int main() { 
    ... 
    StructHashTable *B0 = (StructHashTable *) malloc(N_ELEMS*sizeof(StructHashTable)); 
    ... 
} 

void resizeHash(StructHashTable *hash) { 
    int size = currentElements + N_ELEMS; 
    StructHashTable newHash[size]; 
    int i; 

    for (i = 0; i < size; i++) newHash[i].key = FREE; 

    for (i = 0; i < currentElements; i++) insertHash(newHash, hash[i]); 

    currentElements = size; 

    hash = (StructHashTable *) realloc(hash, size*sizeof(StructHashTable)); 
    if (hash != NULL) { 
     for (i = 0; i < size; i++) hash[i] = newHash[i]; 
    } 
} 

Что случилось сейчас? Я плохо использую realloc? или что? C сводит меня с ума ...

OLD: Я работаю в университете в выполнении домашних заданий, и мне нужно, чтобы изменить статический массив в C, он должен быть статическим, то debbugger говорит нарушение сегмента ...

у меня есть основная функция, которая объявляет массив ...

// File: main.c 
    int main() { 
     ... 
     StructHashTable hash[N_ELEMS]; 
     ... 
    } 

в какой-то момент во время выполнения Мне нужно больше элементов, чем N_ELEMS и я написал функцию, чтобы сделать это в HashTable.c, это метод:

// File: HashTable.c 
    #define N_ELEMS 32 
    int currentElements = N_ELEMS 

    void resizeHashTable(StructHashTable *hash) { 
     int size = currentElements + N_ELEMS; 
     StructHashTable newHash[size]; 
     int i; 
     // Inicialize newHash 
     for (i = 0; i < size; i++) newHash[i].key = FREE; 

     // Insert old hash elements to the new table... 
     for (i = 0; i < currentElements; i++) { 
      insertHash(newHash, hash[i]); 
     } 

     currentElements = size; 
     // I've tried making hash null with no luck... 
     //hash = NULL; 
     //free(hash); 
     // HERE'S THE ERROR... 
     hash = newHash; 
     // I've tried *hash = *newHash with the same result... 

    } 

Может ли кто-нибудь сказать мне, как делать то, что я пытаюсь сделать?

Спасибо.

+6

Невозможно изменить размер статически распределенного массива. Ваша домашняя работа, вероятно, не говорит об этом. – zneak

+0

Возможно, проблема дизайна? потому что домашнее задание говорит, что ясно ... – josecash

+1

Если ваша домашняя работа написана на английском языке, подумайте о том, чтобы опубликовать эту часть в своем ответе или в комментарии. * Нет способа изменить размер выделения. * Единственное, что вы можете сделать, это скопировать то, что у вас уже есть в недавно выделенной памяти, и освободить старое выделение; но это означает, что вам нужны динамические распределения. – zneak

ответ

0

Вы получаете ошибку, потому что пытаетесь изменить значение l для статически выделенного массива 'hash'. Всякий раз, когда вы определяете массив (как в основной)

StructHashTable hash[N_ELEMS]; 

SizeOf (StructHashTable) * N_ELEMS байт памяти выделяется для хэша и хэш указывает на первый байт. Такое распределение называется статическим распределением, и вы не можете сделать хэш-точку для некоторого другого распределения памяти. Он будет давать ошибку, как вы указали, потому что значение l-value i.e слева не может быть изменено. Вы не можете освободить память, назначенную для хэша. Память, присвоенная хешу, будет освобождена только в том случае, если main завершится.

// HERE'S THE ERROR... 
    hash = newHash; 

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

int main() { 
... 
//Initial hash table creation 
StructHashTable *B0 = (StructHashTable *) malloc(N_ELEMS*sizeof(StructHashTable)); 
... 

... 
//Do something 
... 

... 
//hash table full. So resize hash table. This function call need not be inside main. Just for illustration purpose I am doing it here. 
B0 = resizeHash(B0); 
... 
} 

И вот ваша измененная функция resizeHash.

StructHashTable* resizeHash(StructHashTable *oldHash) { 

int size = currentElements + N_ELEMS; 
int i; 

//Allocate memory for newHash with larger number of elements. 
StructHashTable *newHash = (StructHashTable*) malloc(size * sizeof(StructHashTable)); 

if (newHash != NULL) { 
    for (i = 0; i < currentElements; i++) { 
    // Copy one by one oldHash table elements into newhash table 
    //Something like below, or whatever you have been doing before to copy. 
    newHash[i] = oldHash[i];   
    } 
} 

//Free memory occupied by oldHash 
free(oldHash); 
//Set new value for currentElements 
currentElements = size; 

//return the newHash address to calling function. 
return (newHash); 

} 
+0

Хорошо, я сделал это, но все еще получаю ошибку, я обновил сообщение с новым кодом ... Спасибо в любом случае. – josecash

+0

Ваши обычаи free и realloc вызывают проблемы. См. Код, который я опубликовал выше для лучшего понимания. –

+0

Большое спасибо, что работает наконец, указатели меня путают так много ... Спасибо !!! – josecash

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