C 语言结构体菜鸟级问题

来源:百度知道 编辑:UC知道 时间:2024/06/13 14:47:34
#include "stdio.h"
#include "stdlib.h"
typedef struct{
int a;
int b;
}f_struct;
main()
{
f_struct *my_struct;
my_struct-> a=1;
my_struct-> b=1;
printf("\n%d\n%d\n",my_struct-> a,my_struct-> b);
}
在TC中 编译报错
在VC6.0中 能通过编译 但是 运行异常终止

而改为如下
则TC正常
VC还是运行异常终止
WHY???
#include "stdio.h"
#include "stdlib.h"
typedef struct {
int a;
int b;
} frm_struct;
frm_struct *my_struct;
main()
{
my_struct-> a=1;
my_struct-> b=1;
printf("\n%d\n%d\n",my_struct-> a,my_struct-> b);
}

frm_struct *my_struct;
// 你只是定义了一个frm_struct的全局(第一个为局部)指针变量,你并没有给它指向,VC下将其置为NULL.

my_struct-> a=1;
my_struct-> b=1;
// 而main函数中对一个实际为NULL的my_struct指针取成员操作,VC是会报错的.

TC的检测没有VC的强,不报错,但是输出来的却是垃圾信息!

你可以在main函数中这样:
frm_struct my_struct_value;
my_struct = &my_struct_value;
// 添加这两句后,my_struct就有了指向,不再为NULL,VC和TC都可以正常运行了.

或者可以这样改:
frm_struct *my_struct;
修改为:
frm_struct my_struct;
...
my_struct-> a=1;
my_struct-> b=1;
修改为:
my_struct.a=1;
my_struct.b=1;
printf("\n%d\n%d\n",my_struct.a,my_struct.b);
这样修改好像有违你使用指针的深意,呵.

总之你的错误就在于,没有对指针进行初始化,因为VC将没有初始化的指针直接定为NULL,对NULL取成员的话是必须出现运行时错误的.
就好像:
int &pi = NULL;
*pi = 10;
// pi实际为NULL,但是对其取值操作....ERROR

main()
{
f_struct *my_struct,my_struct_1;
my_struct=&my_struct_1;
//加上这句就OK了..

木有分配内存啊

加上my_struct=(f_str