C 带空格的算术指针*

C 带空格的算术指针*,c,pointers,C,Pointers,因此,我需要创建一个对strange_步骤的调用,从而打印出if语句: void strange_step(void* value) { if(*(int*)(value+5) == 15) printf("4: Illinois\n"); else printf("4: ERROR\n"); } 我尝试了以下方法(据我所知,在gcc中,它将void*当作char*处理,因此递增1字节): 但这似乎只是打印出随机数。我遗漏了什么?当您键入value+5时,它将指针移动了

因此,我需要创建一个对strange_步骤的调用,从而打印出if语句:

void strange_step(void* value)
{
    if(*(int*)(value+5) == 15)
    printf("4: Illinois\n");
else
    printf("4: ERROR\n");
}
我尝试了以下方法(据我所知,在gcc中,它将void*当作char*处理,因此递增1字节):


但这似乎只是打印出随机数。我遗漏了什么?

当您键入
value+5
时,它将指针移动了5个字节,然后将其转换为
int*
。取决于您的平台,
int
是4或8个字节。在一台小小的endian机器上

0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000
^         ^
value     value+5

您正在移出
int
边界,因此您可能正在查找关闭256倍的值。我猜你经常看到251658240?这就是为什么。

当您键入
value+5
时,它会在将指针转换为
int*
之前将指针移动5个字节。取决于您的平台,
int
是4或8个字节。在一台小小的endian机器上

0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000
^         ^
value     value+5

您正在移出
int
边界,因此您可能正在查找关闭256倍的值。我猜你经常看到251658240?这就是为什么。

您有两个问题:

  • 不允许使用
    void*
    执行指针算术
  • 从非对齐指针读取
    int
    可能会导致错误
但是,如果要将15推入适当的偏移量,可以执行以下操作:

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

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

您有两个问题:

  • 不允许使用
    void*
    执行指针算术
  • 从非对齐指针读取
    int
    可能会导致错误
但是,如果要将15推入适当的偏移量,可以执行以下操作:

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

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

您需要将函数更改为:

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

您需要将函数更改为:

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


int
的大小通常为4,如果(*(int*)值+5)==15),我想您需要
我发现一个XY问题。我严重怀疑你是否需要(甚至真的想要)一个像你所展示的那样的
奇怪的步骤。您真正想要实现的是什么?
如果(*(int*)(value+5)==15)
是未定义的行为-它访问
int
的非对齐内存地址@ldgabbay确实提供了一个可能的UB结果。@user3424684该方法是错误的,并且参与了非标准指针数学<当涉及指针算术时,code>void*
不需要作为
char*
的同义词处理。它甚至不需要使用指针算法。要使指针数学起作用,指向的指针必须具有完整的类型和可定义的步幅,
void
没有。
int
的大小通常为4,如果(*(int*)值+5)==15),我想您需要
我发现一个XY问题。我严重怀疑你是否需要(甚至真的想要)一个像你所展示的那样的
奇怪的步骤。您真正想要实现的是什么?
如果(*(int*)(value+5)==15)
是未定义的行为-它访问
int
的非对齐内存地址@ldgabbay确实提供了一个可能的UB结果。@user3424684该方法是错误的,并且参与了非标准指针数学<当涉及指针算术时,code>void*
不需要作为
char*
的同义词处理。它甚至不需要使用指针算法。要使指针数学起作用,指向的指针必须具有完整的类型和可定义的步幅,
void
没有。是的,我在奇怪的步骤方法中放置的printf语句反复给出了251658404。这意味着我需要arr[1]的第一个字节等于15?很抱歉造成混淆,这是我第一次处理指针。或者,我可以使用一个字符数组,将数组[4]的值设置为15的ascii值吗?嗯,我不确定你到底想做什么。奇怪的一步应该怎么做?明白了。感谢everyoneYes的帮助,我在奇怪的步骤方法中放置的printf语句反复给出了251658404。这意味着我需要arr[1]的第一个字节等于15?很抱歉造成混淆,这是我第一次处理指针。或者,我可以使用一个字符数组,将数组[4]的值设置为15的ascii值吗?嗯,我不确定你到底想做什么。奇怪的一步应该怎么做?明白了。谢谢大家的帮助,这是有意义的。但为什么在数据之前需要(&R)?我想您可以只说数据[5],但这会导致seg故障。@user3424684这不是必需的。您可以使用
*((int*)(data+5))=15。它可能看起来与函数中的相同,但事实并非如此。注意:函数中的
是一个
无效*
,(没有完整的类型)。此处
数据
具有完整的类型(一个
字符
数组)。@user3424684在
数据[5]
之前需要一个符号和
,以获取第五个字节的地址。您可以用
(数据+5)
替换
&数据[5]
。这很有意义。但为什么在数据之前需要(&R)?我想您可以只说数据[5],但这会导致seg故障。@user3424684这不是必需的。您可以使用
*((int*)(data+5))=15。它可能看起来与函数中的相同,但事实并非如此。注意:函数中的
是一个
无效*
,(没有完整的类型)。此处
数据
具有完整的类型(一个
字符
数组)。@user3424684在
数据[5]
之前需要一个符号和
,以获取第五个字节的地址。您可以将
&data[5]
替换为
(data+5)