C的一个问题,哪里错了

来源:百度知道 编辑:UC知道 时间:2024/05/31 02:20:33
#include <stdio.h>
int main(void)
{
int a,*p,**q;
p=&a;
*q=p;
**q=20;
printf("a=%d\n",**q);
return (0);
}

VC6+WinXP通过

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a,*p,**q;
p=&a;
*q=p; // 因为**q是指向*q的指针,然而虽然q已经有实际存储空间,
// *q却是没有存储空间的(而int *p中的p是已经有实际存储空间
// 的,因为p是一个被命名的实际变量,存在于编译器的名字表中),也就是说,
// 在q没有被初始化之前,写*q是无效的。
// 比如我们不能这样写:
// int *p; *p = 10;
// 一个道理。
// 所以这里把p赋值给一块未分配的内存将导致内存错误
// 应该写成 q=&p;
**q=20;
printf("a=%d\n",**q);
return (0);
}

**q=20;
这句有问题,整数付给整数没错,但指针变量不同于其他变量,它控制的内存(*q指向一块内存,可以认为q间接的控制内存)是不确定的,**q=20; 试图强行改变一块内存的值,必然导致冲突,在对**q赋值前,q是要有初值的,像可乐那样,q=&p,或者是别的初值.

我想了半天没把语言组织清楚,可乐兄赞一个~!

**p=20错
不要给指针赋值
就这一个错误~~
指针控制的是内存
编译时可能不会出错
但有可能造成数据丢失

不知楼主有没有看过C++,如果有的话,这里还可以用另一种观点来解释的。q是一个值为地址的指针变量,*q没有声明,因此不能在编译时由编译器分配内存,只能由程序员指定,或者动态分配。
q=malloc(sizeof(int *));
这里就为*q分配了一块动态内存,其实编译器对于所以数据结构都是内存快和各种内存快的标记,这里之所以说和C++有关,是因为在C++里,new是经常用来实例化一个动态对象的,而这里是创建一个动态变量,术语有些不同,但是楼主以后会了解到,