struct stat st;
struct stat *st;
【就事论事的解释】
struct stat *st;
是定义了一个stat结构体的指针,
这句话的重点在于是“指针”,其本质上,(在32位的体系结构中)也就是一个32位的数而已。
对于名称和实体来说:
名称:
一个名字叫做st指针
实体:
内存里面,也只有一个32位的空间,来存放这个指针。
struct stat st;
定义饿了一个stat类型的结构体,名字叫做st。
这里的重点是“结构体”,其根据结构体具体定义的不同,占用不同的物理空间大小。
这里的名称和实体:
名称,是一个叫做st的结构体。
实体:
就是一个结构体,结构体有多大,st就占用了多大的物理空间。
也就是说,比如你的结构体很复杂,比如所有成员空间加起来,有80字节,那么,这个st实际就占用了80个字节的大小。
【为何容易犯错】
意思解释完了,说一下为何会犯这样的错误,
我们是定义了这个:
struct stat *st;
但是,实际只是定义所需要的结构体的指针,而不是实际结构体本身。
举个例子,结构体好比是一个房间。
不同类型的房间大小不同,占用的物理空间也不一样。
结构体的指针,好比一个房间的一把钥匙。
不论其所相关的房间的大小,钥匙,始终只占钥匙这么大一点的空间(默认,可以理解为4个字节,32位)。
我们之所以犯这样的错,归根结底,都是太“贪”了,以后弄了个指针(钥匙),系统就会自动给你分配好了,
指针所指向的东西(别人就会给你个房子。。。)。
【引申】
以后不论你在别处再看见类似的指针,
不管这把钥匙可以开的是,一个小房间,还是一栋别墅,还是一个汽车,还是一个玩具车,
它都只是一把钥匙而已,只是这么大而已。物理上分配的空间也都是32位而已。
记住,如果你没有得到其他的房子或汽车,而只是弄了把钥匙。除非你买了房子(自己申请一个结构体),否则,没人会白白送你房
子的(系统不会理会你这个指针指向哪里,更不会自己另外给你分配一个结构体)。
如果还没完全理解,那么教个最简单的方法,只要记住这个就好了:
钥匙 = 32位 = 4字节
这样,你就不会搞混淆了。
【后记】
如果都只是弄把钥匙,就都有了房子车子,那么现在就不会有这么多为买房买车而郁闷的了,
直接去几元钱复制一把就好了。。。
个人理解:
同样,结构体是如此,在定义其他类型也是一样
char *str1;
char str2[20];
这么定义之后,我们只传给str1一直指针,而不能给str1传一个字符串。
在定义之后这样使用:
sprintf(str1,"....",..);
那么,这样相当于往str1里面装东西,但是str1在内存中是一个地址(可以看做一个数),那么str1在内存中只占1个或2个字节(实际根据OS来定)。把一个字符串往str1里面装,就会出现Segment fault段错误。
非要这样做,那就需要用malloc给sr1申请空间。
但是这样是合法的:
char *str1="asdfg";定义并初始化,系统会给str1分配一个连续的空间放这个字符串,字符串的首地址放在str1中。
str1[20]在内存中那个,不管你是不是用,它都会有20个字节。