首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

用构造体指针发生的怪事

2013-01-01 
用结构体指针发生的怪事请问为什么注释掉程序中标记的那行用可以在codeblocks中正常运行?(貌似VC6不行),而

用结构体指针发生的怪事
请问为什么注释掉程序中标记的那行用可以在codeblocks中正常运行?(貌似VC6不行),而有那行时不能运行?


[解决办法]
你没有分配内存就是用指针,会造成内存越界,而内存越界的行为后果在c语言规范中是没定义的,也就是说什么情况都可能出现。
[解决办法]
正如一楼和二楼说的,出现问题与第二个变量没关系,错误是因为你没有把指针变量p指向有意义的内存区即现分配的或已存在的。如可以这样使用:

    struct Test *p = (struct Test *)malloc(sizeof(struct Test));
    p->t=1;
    p->s=2;
    printf("%d %d\n",p->t,p->s);

    struct Test q = {1, 2};
    struct Test *p = &q;
    printf("%d %d\n",p->t,p->s);

[解决办法]
你定义了一个指针,没有分配空间。即使去掉那句你程序也是有问题的
[解决办法]
不过三楼木有释放掉申请的内存吧。。。free(p);
[解决办法]
在使用指针之前应该确保指针指向 一个 确定已分配 内存的空间 或者 NULL。
用指针指向指向未知空间,就会照成 内存越界了,造成每次运行的情况不唯一。
[解决办法]
引用:
貌似大都知其然,不道其所以然。。。

我想知道的是:为什么可以用那个没初始化的指针输出赋予的值?这难道是巧合吗?

没用过codeblocks,有可能编译器有特殊处理。

[解决办法]
C是一种语言。

“Process returned 4”貌似要return 0 才是正常返回。
[解决办法]
难道你多运行几次,程序一次都不报错?  程序运行正常说明 指针指向的是一些不重要的数据,修改了其指向空间的数据对系统和其他程序没有重大的影响。  如果修改到一些系统数据,操作系统就会跳出来说你 内存越界。
指针如果不赋初值,就是乱指的。
如果你程序运行正确,就应该是凑巧的事。 这种问题,相信c++ 学的时间稍长很多就会遇到的吧!
[解决办法]
这说明了VC在这方面做的要好一点,如果没有非配内存,指针的指向就是不确定,在VC里面,会将所有栈里面的数据初始化0xcc,然后这个指针指向了0xcccccccc,这是一个内核空间的地址,应用程序不能访问这个地址,访问会抛出int 3异常,显示0xc00000005异常,表示0xcccccccc处内存不能为write,但是codeblocks就没有这方面的保护,gcc就没有这一措施。

热点排行