如何引用函数的指针?

时间:2017-12-27 14:25:47

标签: c arrays pointers

所以,我有以下结构

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;
}

为什么会这样?

1 个答案:

答案 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标准定义的不是,而是该语言的供应商特定扩展。