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...
}
Может ли кто-нибудь сказать мне, как делать то, что я пытаюсь сделать?
Спасибо.
Невозможно изменить размер статически распределенного массива. Ваша домашняя работа, вероятно, не говорит об этом. – zneak
Возможно, проблема дизайна? потому что домашнее задание говорит, что ясно ... – josecash
Если ваша домашняя работа написана на английском языке, подумайте о том, чтобы опубликовать эту часть в своем ответе или в комментарии. * Нет способа изменить размер выделения. * Единственное, что вы можете сделать, это скопировать то, что у вас уже есть в недавно выделенной памяти, и освободить старое выделение; но это означает, что вам нужны динамические распределения. – zneak