C 带空格的算术指针*
因此,我需要创建一个对strange_步骤的调用,从而打印出if语句: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时,它将指针移动了
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
char data[32];
*((int*)&data[5]) = 15;
strange_step(data);
这将打印您期望的内容()。但是,除非您修改
奇怪的\u步骤
以停止读取未对齐的数据,否则您的程序将依赖未定义的行为。您有两个问题:
- 不允许使用
执行指针算术void*
- 从非对齐指针读取
可能会导致错误int
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如果您愿意,请改为code>。它可能看起来与函数中的相同,但事实并非如此。注意:函数中的值
是一个无效*
,(没有完整的类型)。此处数据
具有完整的类型(一个字符
数组)。@user3424684在数据[5]
之前需要一个符号和,以获取第五个字节的地址。您可以用(数据+5)
替换&数据[5]
。这很有意义。但为什么在数据之前需要(&R)?我想您可以只说数据[5],但这会导致seg故障。@user3424684这不是必需的。您可以使用*((int*)(data+5))=15如果您愿意,请改为code>。它可能看起来与函数中的相同,但事实并非如此。注意:函数中的值
是一个无效*
,(没有完整的类型)。此处数据
具有完整的类型(一个字符
数组)。@user3424684在数据[5]
之前需要一个符号和,以获取第五个字节的地址。您可以将&data[5]
替换为(data+5)
。