以下是引用zbgg222在2015-11-7 22:49:35的发言:
请问我定义一个结构体struct L。它包含int a,int b,char c;
再定义一个struct L *w,*new;
那么,new=(struct L *)malloc(5*sizeof(struct L)),那么new是不是就是空的L[5]呢?请大神帮忙回答一下。。还有程序里总出现dereferencing pointer to incomplete?
我在做通讯录。求教。。
1.首先弄明白结构体本质上是重新定义的一个数据类型,就像int, char一样
你定义一个新的数据类型为“strut L”此时尚未定义变量!就像你用int 一样,你可以像用“int”一样使用“struct L” L不要单独拿出来,比如:
struct L M(M才是变量,L就像你用int中的t一样,无意义啊~)
struct L 数据类型的结构是
{
int a
int b
char c
}
既然struct L是一种数据类型,那你再定义struct L *w,*new; 是什么意思?难道数据类型int可以通用float么,显然不行~ 你重新定义struct F, *w,*new是可以的!
;2. new=(struct L *)malloc(5*sizeof(struct L)),那么new是不是就是空的L[5]呢?
先弄明白这里new是什么呢?假设你新定义了一个structF, 结构为 *w,*new,这里new存放的是一个 涵盖五个struct L数据类型大小的一块内存的首字节地址!你为一个结构体内部的一个节点分配一块内存,这个完全无法理解啊,int或者int中的t字母有指定内存么?(不恰当的类比,不过大概就是这个意思)
struct L变量都没定义呢,你这个new能指向L[5]才叫怪了,L[5]是什么鬼,
结构体怎么跟数组混在一起了?????
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这里补充一点吧,最近刚看到链表,就适当说一下对结构体,指针,数组的一点看法,希望对你有帮助:
数组分配内存是连续的,但是当数据足够大的时候,你就很难找到整块连续的可用内存,实际情况是你需要调动零散分布在各个区的内存来保存数据,可是随机存储后还要考虑到调用,这就决定了一个数据单元不光要存数据,还要保存两个内存之间的关系,数组中可以通过内存地址+1来找到下一个数据,但零散存储的可不行,所以要用到指针,这样一个数据单元就要分成两部分,数据部分跟指针部分,而结构体恰恰可以满足这个需求,因为你可以自行构建一个包含数据以及下一个数据指针的结构体,然后循环即可调用数据!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以上个人看法,刚开始学C,不对之处欢迎指正
建议仔细看一下动态内存,数组,指针,结构体相关的内容,把基本概念弄明白先!
[此贴子已经被作者于2015-11-8 06:16编辑过]