【问题标题】:How can I send a pointer to element in array from type `void*`?如何从 `void*` 类型发送指向数组中元素的指针?
【发布时间】:2018-12-07 15:25:32
【问题描述】:

给定以下数组(例如):

int arr[6] = {1 , 2 , 3 , 4 , 5, 6};

如果我使用以下声明发送它:

int func(void* array, int n);

如何从func 发送到以下函数:

int f(void* element);

数组中某个元素的地址?

我试图做这样的事情:f(array + i);(为了发送&array[i]),但我收到以下错误:

算术中使用的“void *”类型指针

那么,我该怎么做呢?

【问题讨论】:

  • func 仅使用int 数组调用,还是funcarray 参数可以是不同的类型?
  • func 是否知道arr 的类型?如果没有,那么你可能不走运。在这种情况下,您必须传递项目大小。
  • 首先将其投射到int*f((int*)array + i)
  • @DanielPryden 不,array 不仅仅是int 数组。
  • @Lundin 所以我需要传递额外的参数int size_ 来描述数组中任何元素的大小?

标签: c arrays pointers void


【解决方案1】:

接受,无论出于何种原因,你不能写

int func(int* array, int n);

您需要将 array 的类型改回 指针算法 有效的类型:

int* real_array = (int*)array;

然后您可以使用易于处理的符号real_array[i] 来访问元素。

如果您想保持func 的通用性,尽管您不知道类型,您必须将元素大小与数组大小一起传递:

int func(void* array, int/*ToDo - use size_t here too*/ n, size_t element_size)

那么你可以使用

f((const char*)array + i * element_size)

虽然我担心这只是将解决通用性的问题推到调用堆栈的下方。

【讨论】:

  • 感谢您的回答,它阐明了主题! :)
【解决方案2】:

如果func 需要能够处理不同类型的数组,那么您需要向func 添加一个新的size_t 参数来告诉它数组项的大小。否则,array[1] 之类的定义不明确:您的意思是 array + 4 bytesarray + 8 bytesarray + 1 byte 还是其他?

如果您有项目大小参数,您可以将array 转换为char* 并偏移i * item_size 以获得指向ith 元素的指针。

(请注意,您的项目大小参数可能应该是size_t 而不是int。)

【讨论】:

  • 这个参数的类型必须是size_t ?不能是int
  • @Software_t:两个void*之间的差异总是可以用size_t表示,但不保证可以用int表示。所以size_t 更正确。
  • 如果我将其定义为int,哪些类型会出错? (即,在什么情况下,如果我将其定义为int,它可能会失败?)
  • 另请参阅stackoverflow.com/questions/131803/unsigned-int-vs-size-t 以进一步讨论size_tint 之间的区别。另请注意,size_t 保证是未签名的,int 是 AFAIK 保证签名的,所以这是一个明显的区别。
  • 当我向它传递一组我从太空拍摄的地球照片时,它失败了,每张照片的大小为 16GB。只要数组元素的大小不能表示为 int,它就会失败。所以你可能永远不会看到它失败。但一定要编写正确的代码并使用size_t
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2017-09-05
  • 2013-07-19
  • 1970-01-01
  • 2020-04-01
  • 2012-05-12
  • 1970-01-01
相关资源
最近更新 更多