假设我有一个void指针(更像是;数组),我想要获取其中的项目。 因此,我知道指针[i]不会起作用,因为它无效并且我不知道这种类型;我尝试使用偏移技术:
void function(void* p, int eltSize){
int offset = 3;
for(i = 0; i<offset; i++){
memcpy(p+(i*eltsize), otherPointer, eltSize);//OtherPointer has same type.
}
//End function
}
这个功能很好用,但唯一的问题是在main(..)结束时我得到了分段错误。我知道它是因为指针以及我如何访问它的项目,但我不知道如何纠正问题并避免分段错误。
答案 0 :(得分:4)
正如@sunqingyao和@flutter指出的那样,你不能使用void
指针算术,而是使用char *
(一大块字节a qsort
):< / p>
#include <stdio.h>
#include <string.h>
void function(void *ptr, size_t eltSize, void *otherPointer, size_t offset)
{
char *p = ptr;
for (size_t i = 0; i < offset; i++) {
memcpy(p + (i * eltSize), otherPointer, eltSize);
}
}
int main(void)
{
int arr[] = {1, 2, 3};
int otherValue = 4;
function(arr, sizeof *arr, &otherValue, sizeof arr / sizeof *arr);
for (int i = 0; i < 3; i++) {
printf("%d\n", arr[i]);
}
return 0;
}
答案 1 :(得分:0)
引自N1570 6.5.6加法运算符(强调我的):
2另外,两个操作数都应具有算术类型,或者 一个操作数应该是指向完整对象类型的指针 其他应具有整数类型。 (增量相当于添加 1。)
显然,void
不是完整的对象类型。因此,在+
上应用void *
运算符会调用未定义的行为,这可能会导致分段错误或其他任何操作。
解决问题的一种方法是将参数p
声明为char *
。