指针赋值问题

时间:2010-12-01 18:42:04

标签: c

当我在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后,我变得无法访问;为什么?

6 个答案:

答案 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。一旦你搞砸了调用框架 - 所有的赌注都关闭了 - 你最终会处于腐败状态。