函数与指针的问题,帮忙解决一下吧,谢谢了!

chenzhen2007 2004-04-01 11:14:19
单链表的初始化和内存释放的问题:
typedef srruct Node
{ DataType data;
struct Node *next;
} SLNode;
void ListInitiate(SLNode **head) //初始化
{
if((*head=(SLNode *)malloc(sizeof(SLNode)))==NULL) exit(1);
(*head)->next=NULL;
}
void Destroy(SLNode **head) //销毁链表,内存释放
{
SLNode *p, *p1;
p=*head;
while(p!=NULL)
{ p1=p;
p=p->next;
free(p1);
}
*head=NULL;
}
请问,在初始化时,申请到的内存中都放了那些,是如何存放的?
为什么在初始化和释放时,参数都要设计成二级指针型?如果是指针型会怎样?
谢谢了!
...全文
69 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bideyore 2004-04-02
  • 打赏
  • 举报
回复
同意:loadme_litbear(Ursa)
如果不愿意用二级指针,也可以自己定义一个HEAD:
typedef struct SLNode* LinkList;

void ListInitiate(LinkList* llist) //初始化
{
if((llist=(SLNode *)malloc(sizeof(SLNode)))==NULL) exit(1);
(llist)->next=NULL;
}

void Destroy(LinkList* llist) //销毁链表,内存释放
{
SLNode *p, *p1;
p=llist;
while(p!=NULL)
{ p1=p;
p=p->next;
free(p1);
}
llist=NULL;
}
不过我是这样做的:
struct Node{ //main part
DataType info;
PNode link;
};

typedef struct Node* LinkList; //head array

//----------------------------------------------------------------------------------------
LinkList creatNullList_link(void) //creat a null list
{
LinkList llist;
llist=(LinkList)malloc(sizeof(struct Node)); //sign memorry
if(llist!=NULL) //examine whether signed
{
llist->info=0;
llist->link=NULL;
}
return(llist); //if signed,return the head of the linklist
}
这样,你在初始化时可以:
LinkList llist=creatNullList_link();
直接得到一个空链表。:>

langjifengyu 2004-04-02
  • 打赏
  • 举报
回复
眼睛都不敢炸一下
要不就没饭吃了
jack_wq 2004-04-02
  • 打赏
  • 举报
回复
初始化申请空间,内存数据应该是随机的!
w3guy 2004-04-01
  • 打赏
  • 举报
回复
大家回的好快,刚看到没有人回答,贴上去后已经排在第三了。 哈哈
w3guy 2004-04-01
  • 打赏
  • 举报
回复
在初始化时,申请到的内存中放的数据是不可预知的。
在函数中既要要修改指针本身也要修改指针所指的内容,所以必须用二级指针型。
loadme_litbear 2004-04-01
  • 打赏
  • 举报
回复
如果不用二级指针,你就要自己在外面弄一个连标头的实体传进去拉
用二级指针你可以在外面只弄一个指针就好了,不过我倒是喜欢在外面弄一个头出来
zouxueping 2004-04-01
  • 打赏
  • 举报
回复
申请内存时并不初始化,里面的数据是随机的。用二级指针是因为它要改变的是指针本身,如果用一级指针则只能改变它指向的数据而不能改变指针本身。
今天更新一下, 解决之前贴子中提到的一些问题: 1. 封装了几个自定义的函数, 例如 move_to_root, array_get_length, array_move_to_index, 这样可以少调用一些 X64Call; 2. 简单实现了对于类似 [0].A.B[0].C 的路径的解析取值. 接下来说一下遇到的问题和一些体验: 1. 我构造的测试数据大小是大约是 96MB, 在我的机器上可以正常解析, 再大一些(例如 128MB)会崩溃, 崩溃位于 ParsedJson.allocateCapacity , 琢磨了下没琢磨明白 (温馨提示: 真要是这种大小级别了还是建议各位用 SAX 方式); 2. 除了上面这点, 还有个已知的比较隐蔽 BUG, 貌似是 print_ 这个函数的锅: 静态编译之后, 在 demo 中如果 print_ 递归打印了一个 Object 例如 [0], 再点击解析就会在 iterator_free 崩溃. 如果只是取值就不崩溃. 3. 这个库会拷贝数据, 在针对过长的数据的时候这不是好做法, 感觉这个库更像是科研性质, 和那些千锤百炼的老牌库相比, 目前可能只有速度占优势了; 4. 机器或者其它方面的限制, 我用易语言跑不出宣传文章中的千兆字节每秒, 不过几百 MB/s 还是有的; 5. 由于解析的时候它会拷贝数据, 我不清楚有没有可能会产生 64-bit 的内存地址, 暂时就是指针到文本当 32-bit 用, 但心里很没底, 希望 eWOW64Ext 作者有空可以帮忙一下... @shier2817  谢谢! 6. 库用的是 10.0.17134.0 版本的 SDK /MT 编译的, 但已经无法支持 WindowXP, 低版本的 SDK 编译不过去, 对这些指令不熟悉所以没有去探究原因(也许就是不支持, 详情请翻阅 MSDN); 7. 关于编译模式: 用 MinSizeRel 生成的话, 会导致 double 取值异常, 具体原因未深究, 所以默认使用了 Release . 我将会在附件中附上三种编译模式生成的文件供各位研究: RelWithDebInfo, MinSizeRel, Release; 8. 我对于 WOW64Ext 方面的知识不了解, 所以无法保证代码的稳定性, 抛砖引玉, 所以如果你希望封装完整的模块和工具, 可以进群与我交流.

70,026

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧