如何引用函数的指针?

问题描述 投票:0回答:1

所以,我有以下结构

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

为什么会这样?

c arrays pointers
1个回答
3
投票

这里

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

© www.soinside.com 2019 - 2024. All rights reserved.