概述
1.结构体定义问题
typedef struct{
int a;
char b;
int b;
}test;
然后再程序中定义一个结构体变量:struct test iseq;
引用成员变量:iseq.a=1;
编译程序时候会出现:dereferencing pointer to incomplete type错误
解决方法:在结构体定义的时候struct 后面一定要先有一个名字(不知道是否正确,但是实验结果是对的),改为如下:
typedef struct _test{
int a;
char b;
int b;
}test;
或者直接这样定义:
struct test{
int a;
char b;
int b;
};
2.关于结构体指针的使用
结构体指针的使用一定要先用一个已知结构体赋值或者先非配内存。
例如定义1中的结构体,程序中定义一下
struct test iseq;
struct test *tmp;
iseq.a=1;
tmp->a=1;
编译程序时通过,但是运行程序时会出现段错误:segmentation fault;
解决方法:
(1)在使用tmp之前先赋值。
例如:tmp=&iseq;
(2)在使用前先分配内存;
tmp=(struct test *)malloc(sizeof(struct test));
原因:结构体指针在使用之前没有分配内存。
3.关于指针长度问题
以下例子:
char proname[100];
char *prefix="host";
struct test iseq;
struct test *tmp;
tmp=(struct test *)malloc(sizeof(struct test));
试想一下式子的值:
sizeof(proname);
sizeof(prefix)
sizeof (struct test);
sizeof(iseq);
sizeof(tmp);
sizeof(*tmp);
sizeof(*proname);
sizeof(*prefix);
strlen (prefix);
以上各式子的值分别为(64为机子,gcc编译器)
100,8,12,12,8,12,1,1,4
通过以上实验可以知道:
指针的长度代表指针自己,例如64机子所有指针都是8bytes,sizeof(iseq)长度为12是因为有内存对齐的原因,将char 对齐成四个字节。
想得到指针指向的内存大小使用strlen函数。
sizeof(proname)为100,这也是指针和数组的区别之一。简单来说就是数组对应一块内存,地址和容量确定,而指针指向一块内存,大小可以变。
4.指针和数组的详细区别
(1) 两者在含义上的区别。
数组对应着一块内存区域,而指针是指向一块内存区域。其地址和容量在生命期里不会改变,只有数组的内容可以改变;而指针却不同,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
(2)计算内存容量的区别
用运算符sizeof可以计算出数组的容量(字节数),而用sizeof却无法计算指针所指内存的容量,用sizeof(p)得到的结果永远是 4或者8(具体根据机器有关)。在进行参数传递时,数组会 自动 退化为同类型的指针。
最后
以上就是大气乌龟为你收集整理的结构体定义使用及指针长度问题的全部内容,希望文章能够帮你解决结构体定义使用及指针长度问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复