2010-12-01 76 views
3

当我在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;为什么?

回答

5

当你做*p = &i,你让p指向单个整数i++p递增p指向“下一个”整数,但由于i不是数组,因此结果未定义。

+0

正确的解释。谢谢。 – hari 2010-12-01 18:47:49

2

你正在观察的是未定义的行为。具体而言,*++p=2中的提领p被禁止,因为i不是具有至少两个成员的数组。在实践中,您的程序很可能试图写入&i + sizeof(int)解决的任何内存。

1

您正在调用未定义的行为通过写入堆栈上的未定义区域。 codepad.org可以防止试图执行不允许的事情的程序,并且您的未定义的行为程序似乎触发了这一点。

如果您尝试在自己的计算机上执行此操作,程序可能会以其他方式(例如分段故障或总线错误)崩溃。

1

表达*++p首先移动指针p指向一个int向前(即,指针变为无效),则取消引用所得指针和试图保存数字2那里,从而写入无效的内存。

你可能意思是*p = 2(*p)++

+0

以下代码正常运行。 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)); 返回0; } 这意味着问题是NT由于* ++ p值= 2.Though我已访问未分配存储器,其NT的问题。在* ++ p = 2 p指向某个值为2的位置;但是混淆的是它没有指出i.SO的值为什么我变得不可访问? – sudhansu 2010-12-02 04:43:59

0

你的代码访问它不拥有的内存,并且结果是未定义的。

所有的代码具有&p做,因为它是目前写的权利是在阅读和&i从大小sizeof(int)的面积写入内存,和另一大小sizeof(int*)的。

以下行全部违反了​​这些约束,通过使用超出允许读取或写入数据范围的内存地址。

*++p=2; 

printf("\n%d",*p); 
printf("\n%d",*(&i+1)); 
0

++修改其参数,所以该线*++p=2;分配2到大概定义call frame增量指针p堆栈上的位置。一旦你搞砸了投注框架 - 所有投注都关闭 - 你最终会陷入腐败状态。