当我在gcc编译器(www.codepad.org)中运行上述程序时,我得到输出为 不允许系统调用:SYS_socketcall 任何人都可以清楚为什么会出现这个错误/输出?
int main() {
int i=8;
int *p=&i;
printf("\n%d",*p);
*++p=2;
printf("\n%d",i);
printf("\n%d",*p);
printf("\n%d",*(&i+1));
return 0;
}
我观察到的是,在执行* ++ p = 2后,我变得无法访问;为什么?
答案 0 :(得分:5)
执行*p = &i
后,您将p
指向单个整数i
。 ++p
递增p
以指向“下一个”整数,但由于i
不是数组,因此结果未定义。
答案 1 :(得分:2)
您所观察到的是未定义的行为。具体而言,禁止在p
中取消引用*++p=2
,因为i
不是包含至少两个成员的数组。实际上,您的程序很可能会尝试写入&i + sizeof(int)
所解决的任何内存。
答案 2 :(得分:1)
您正在通过写入堆栈上的未定义区域来调用未定义的行为。 codepad.org可以防止试图执行不允许操作的程序,并且您的未定义行为程序似乎已触发该程序。
如果您尝试在自己的计算机上执行此操作,您的程序可能会以其他方式崩溃(例如分段错误或总线错误)。
答案 3 :(得分:1)
表达式*++p
首先将指针p
移动到指向前一点int
(即指针变为无效),然后取消引用结果指针并尝试将数字2保存在那里,因此写入无效的记忆。
您可能需要*p = 2
或(*p)++
。
答案 4 :(得分:0)
您的代码访问它不拥有的内存,并且结果未定义。
您的所有代码都有权这样做,因为它目前编写的是从sizeof(int)
的{{1}}区域内存中读取和写入,而&i
处的另一个大小为sizeof(int*)
{1}}。
以下行都违反了这些限制,使用了允许读取或写入数据的范围之外的内存地址。
&p
答案 5 :(得分:0)
运算符++
修改其参数,因此行*++p=2;
将2
分配给堆栈中可能定义call frame 和的位置增加指针p
。一旦你搞砸了调用框架 - 所有的赌注都关闭了 - 你最终会处于腐败状态。