主题:求助,这个指针定义可以编译但不能运行
yeliming
[专家分:0] 发布于 2011-12-09 14:48:00
各位大虾好!
我是刚学的C,目前在看的书是C PRIMER,这两天刚看到数组与指针那一章。
但现在有一个最简单的步骤过不去。
[code=c]
int main(void)
{
int * par;
*par=5;
return 0;
}
[/code]
在VC++中可以编译,但不能运行,提示如图中所示的错误。
我明明已经定义了指针,为什么还是提示未定义?
回复列表 (共4个回复)
沙发
windy0will [专家分:2300] 发布于 2011-12-09 21:58:00
这应该就是所谓的野指针。应该这样使用
int n;
int *p = & n;
// 以后能用n 的地方基本上能用 *p代替。
// 但不能 对 *p再次取地址(& * p 这是也是错的)
板凳
夜清凉 [专家分:30] 发布于 2011-12-21 11:01:00
C语言规定,不允许把一个数赋予指针变量,故下面的赋值是错误的:
int *p;
p=1000;
虽然*par=5;无语法错误,但是它是无法运行的,因为你定义的是一个指针变量par,注意是变量,所以指针内容应该是指向变量,*par=变量:
int *par,n;
par=&n;
n=5;
这样*par就可以与5互换了。
3 楼
yjypm8460859 [专家分:970] 发布于 2012-01-05 10:53:00
呵呵!前些天刚和一哥们讨论此问题:这个问题可以看得更深一点,比如int *q=(int *)20 ,就表示q这个指针以赋值了,那为何不能操作*q呢?比如:在嵌入式系统中我们经常这样做 *(int*)0x56000000 = 0;因为没有上OS,所以这些地址都是绝对的,对应相应寄存器操作,而在pc机端上的地址全部是虚拟的,会映射到相应的物理地址上,pc中MMU就是起到这个作用,如果你在程序中写一个绝对地址值,那么说不定经过MMU后映射到哪个寄存器上,这时的操作就危险了,所以说OS在方面会做出限制!不让你去操作,那问题来了,怎么去操作外设的物理地址,这就是要搞驱动了,驱动一般在内核模式下,而我们app 层是在用户模式下的,这就有明显的差异。。。。。请指正!
4 楼
fragileeye [专家分:1990] 发布于 2012-02-06 16:59:00
个人觉得兄弟都说完了。。。
我来回复