所以,我有以下结构
typedef struct DArray {
int end;
int max;
size_t element_size;
size_t expand_rate;
void **contents;
} DArray;
我使用void **contents
的原因是因为我被告知从结构中引用数组的方式
以下是我如何将值推送到内容
DArray *create_array() {
DArray *result = DArray_create(sizeof(int), 5);
int initial[] = {4,1,3,2,0};
void *arr = (void *)(malloc(sizeof(void *) * 5));
int i = 0;
for(i = 0; i < 5; i++) {
*(int *)(arr + i * sizeof(int)) = initial[i];
}
for(i = 0; i < 5; i++) {
printf("Pushing: %d\n", *(int *)(arr + i*sizeof(int)));
DArray_push(result, (arr + i * sizeof(int)));
}
return result;
}
int DArray_push(DArray *array, void *el) {
array->contents[array->end] = el;
array->end++;
if(DArray_end(array) > DArray_max(array)) {
return DArray_expand(array);
} else {
return 0;
}
}
我正在调用像这样的快速排序函数
int DArray_qsort(DArray *array, DArray_compare cmp) {
quicksort(array->contents, DArray_count(array), sizeof(void *), cmp);
return 0;
}
然后我尝试使用以下函数迭代array->contents
void quicksort(void *contents, int count, size_t elem, DArray_compare cmp) {
int i = 0;
for(i = 0; i < count; i++) {
printf("Value: %d\n", *((char *)contents + (i * sizeof(int))));
}
return;
}
但是,我最终得到了垃圾值
但是,以下似乎有效
int DArray_qsort(DArray *array, DArray_compare cmp) {
quicksort(array, DArray_count(array), sizeof(void *), cmp);
return 0;
}
void quicksort(DArray *array, int count, size_t elem, DArray_compare cmp) {
int i = 0;
for(i = 0; i < count; i++) {
printf("Value: %d\n", *(int *)(array->contents[i]));
}
return;
}
为什么会这样?
答案 0 :(得分:3)
这里
DArray_push(result, (arr + i * sizeof(int)));
传递本地变量的地址,即initial
。
当他们留下create_array()
时,他们指出的东西已经死了。
无论您尝试什么,都可能无法再访问指向的值。
假设前者不是问题,那么在此处打印时,您不会将int*
存储起来:
printf("Value: %d\n", *((char *)contents + (i * sizeof(int))))
但是代码不会将void
- 指针转回int*
,而是将代码转换回char*
并取消引用它们。
您也可以定义
void *arr = ...
然后将指针算法应用于void
- 指针arr
:
*(int *)(arr + i * sizeof(int)) = ...
这样做是由C标准定义的不是,而是该语言的供应商特定扩展。