用C所以學習指針和我認爲,作爲一個練習,我可以做一些普通的數組,我得到了使用void當**它的工作是這樣的:與空指針動態數組
struct array{
void **data;
size_t size, capacity;
};
這樣插入元素:
void array_append(array *a, void *element){
if(a->size == a->capacity){
a->capacity += ARRAY_GROW_CONSTANT;
a->data = realloc(a->data, sizeof(void*)*a->capacity);
}
a->data[a->size++] = element;
}
但是,這是不是真的好。該數組存儲指向元素的指針,因此當元素的作用域結束時,它變爲無效,並且它使得數組的內容分散在整個內存中。這個我覺得可以通過分配元素本身來解決這樣反而
a->data[a->size++] = element;
我會做類似
a->data[a->size] = malloc(inserted_element_size);
memcpy(a->data[a->size], &element, inserted_element_size);
size++;
,但我認爲我使用普通void *的時候可以得到相同的的funcionality,而不是無效**
struct array{
void *start;
size_t element_size, size;
};
和插入元件等
void array_append(array *a, void *element){
a->size += 1;
a->data = realloc(a->data, (a->size*a->element_size));
memcpy(a->data + (a->size - 1)*a->element_size, &element, a->element_size);
}
但這導致段錯誤,我不知道爲什麼。據我瞭解(顯然我不),指針是內存中的地址,所以如果我有一個連續的內存塊,我可以存儲任何類型的變量與偏移量。
編輯:感謝您的解釋,它真的幫助。
什麼是數據初始化爲?
我使用了一個函數來初始化數組,並且a->data
被初始化爲element_size。
調用者必須將resutl鑄成元*
我以爲我可以使用宏來讓打字更短的(我認爲這是一件壞事?),但我不瞭解類型轉換的性能從void*
到struct*
。
直接創建元素的動態數組似乎對我更實際。
但是,這不會允許我使用數組作爲通用的?我想要的是定義一個通用陣列,我可以用它來存儲任何類型的,像
array *a1 = create_array(sizeof(int)); // array of int
array *a2 = create_array(sizeof(double)); // array of double
etc...
爲什麼你希望自己的數據被存儲在一個連續的塊?
因爲我認爲你需要一個連續的內存塊來使用帶有偏移量的memcpy。