2013-09-08 3 views
-1

Я пытаюсь вырастить массив, чтобы добавить новые указатели malloc'd. По-видимому, realloc не увеличивает размер. Кроме того, я начинаю с достаточно места для одного указателя в массиве, поэтому, хотя realloc не увеличил размер, я все же ожидал, что смогу скопировать указатель, но я получаю SIGSEGV Segmentation Fault.Seg Fault on memset

typedef struct active_allocation { 
    size_t sz; 
    void *ptr; 
} ACTIVE_ALLOCATION; 

struct m61_state { 
    ACTIVE_ALLOCATION **active_allocations_ptrs_arr; //Array of Points to Active Allocations 
    size_t sz; 
}; 
struct m61_state m61_state; 
... 
ACTIVE_ALLOCATION **active_allocations_ptrs_arr = malloc(sizeof(ACTIVE_ALLOCATION*) *1); 
m61_state.active_allocations_ptrs_arr = active_allocations_ptrs_arr; 
... 
//Create a New pointer, to add to the array 
ACTIVE_ALLOCATION *active_allocation_record = malloc(sizeof(ACTIVE_ALLOCATION)); 

// ** Initially there's space for one pointer, but it hasn't been used yet. 
//m61_state->sz equals 0. 
//Trying to increase the size of an array to 8 for one more ACTIVE_ALLOCATION* Last 4 can be set to NULl 
//sizeof(new_active_alloc_array_ptr) equals 4 at this point 
new_active_alloc_array_ptr = realloc(m61_state->active_allocations_ptrs_arr, m61_state->sz + sizeof(ACTIVE_ALLOCATION*)); 

//** sizeof(new_active_alloc_array_ptr) still equals 4. I want it to be 8. I'm not sure why the size didn't change. 

//Copy the new pointer that was just created active_allocation_record to the array 
memset(m61_state->active_allocations_ptrs_arr[sizeof(ACTIVE_ALLOCATION*)* m61_state->sz], (int)active_allocation_record, sizeof(ACTIVE_ALLOCATION*)); 
+1

http://www.sscce.org/ – dcaswell

+0

'sizeof (new_active_alloc_array_ptr)' - размер указателя. Он никогда не изменится. – interjay

+3

Если вы используете «memset» для «копирования» данных, вы делаете Doing It Wrong ™. Это то, на что «memcpy» (или простое назначение!). –

ответ

1

Я не знаю, почему вы ожидали бы размер new_active_alloc_array_ptr изменить, это указатель, и всегда будет иметь тот же размер - размер указателя.

Там есть ряд ошибок, все из которых может быть причиной вашей аварии:

(1) Вы повторно проклейка к m61_state->sz + sizeof(ACTIVE_ALLOCATION*), когда кажется, что вы хотите, достаточно мест для m61_state->sz записей размера sizeof(ACTIVE_ALLOCATION*) поэтому должна be m61_state->sz * sizeof(ACTIVE_ALLOCATION*).

(2) Кажется, что вы сохраняете указатель realloc'd на временный (new_active_alloc_array_ptr), а затем получаете доступ к исходному значению m61_state->active_allocations_ptrs_arr.

(3) При доступе к массиву вы получаете доступ к элементам как [sizeof(ACTIVE_ALLOCATION*)* m61_state->sz] - здесь нет вызова для sizeof(ACTIVE_ALLOCATION*)*, это должно быть [m61_state->sz].

(4) Элементы в массиве размера n доступны из 0 в n-1, так что даже если бы вы выделили правильно создать массив размера m61_state->sz затем [m61_state->sz] бы еще указать на один элемент за конец пространства вы выделили.

+1

Кроме того, похоже, он пытается скопировать указатель с помощью 'memset', что неверно на нескольких уровнях. – interjay

+0

Это очень хороший момент. –