所以,我有以下结构
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;
}
}
然后我调用了一个类似于quicksort的函数
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;
}
为什么会这样?
这里
DArray_push(result, (arr + i * sizeof(int)));
你传递一个局部变量的地址,即initial
。
当create_array()
离开时,他们指出的东西已经死了并且消失了。
无论你尝试什么,指向的那些值都可能不再被访问。
假设前者不是问题,那么在这里打印它们时不会将qazxswpo存储为:
int*
但是,不是将 printf("Value: %d\n", *((char *)contents + (i * sizeof(int))))
指针投回到void
,而是将代码转换回int*
并取消引用它们。
你也定义
char*
然后将指针算法应用于void *arr = ...
指针void
:
arr
这样做不是由C标准定义的,而是特定于供应商的语言扩展。