带有void *的算术指针

时间:2014-09-01 02:18:30

标签: c pointers

所以我需要创建一个对odd_step的调用,导致它打印出if语句:

void strange_step(void* value)
{
    if(*(int*)(value+5) == 15)
    printf("4: Illinois\n");
else
    printf("4: ERROR\n");
}

我尝试过以下内容(据我所知,对于gcc,它将void *视为char *,因此增加1个字节):

int arr[10];
arr[4] = 15;
arr[5] = 15;
arr[3] = 15;
arr[2] = 15;
arr[6] = 15;
arr[7] = 15;
arr[8] = 15;
arr[9] = 15;
//arr[10] = 15;
strange_step(arr);

但这似乎打印出随机数字。我错过了什么?

3 个答案:

答案 0 :(得分:3)

你在那里遇到两个问题:

  • 不允许使用void*执行指针算术
  • 从非对齐指针读取int可能会导致错误

但是,如果你想将15号鞋拔入适当的偏移量,你可以这样做:

char data[32];
*((int*)&data[5]) = 15;
strange_step(data);

这打印出您期望的内容(demo)。但是,除非您修改strange_step以停止读取未对齐的数据,否则您的程序将依赖于未定义的行为。

答案 1 :(得分:2)

当您键入value+5时,它会将指针移动5个字节,然后再将其作为int*投射。根据您的平台,int为4或8个字节。在小端机器上

0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000
^         ^
value     value+5

你正在离开int边界,所以你可能会发现值偏离256的倍数。我猜你经常看到251658240?这就是原因。

答案 2 :(得分:0)

您需要将功能更改为:

void strange_step(void* value)
{
  // Treat the input pointer as an `int*`.
  int* ip = (int*)value

  // Use the 6-the value of the array.
  // You could also use if ( ip[5] == 15 )
  if(*(ip+5) == 15)
    printf("4: Illinois\n");
  else
    printf("4: ERROR\n");
}