2 ckxkobe ckxkobe 于 2017.11.14 22:37 提问

关于malloc使用的一些问题。

最近在看严版的数据结构,有一些不是很懂。
在对单链表进行插入等操作,需要生成新节点时,并没有检查malloc的返回值。
而在顺序表,栈以及队列中,使用malloc分配内存空间时,都有对其进行返回值的检查。
且当对双链循环链表进行相关操作时,却又检查了malloc的返回值。

还有一点,在检查到malloc开辟失败后,双链循环链表采用了return,而不是exit。

问题1:malloc返回值的检查取决于什么?是所开辟内存大小与安全性的权衡?
问题2:exit()与return()的区别?

11个回答

ckxkobe
ckxkobe   2017.11.14 22:39

图片说明双链循环链表

ckxkobe
ckxkobe   2017.11.14 22:39

图片说明队列

ckxkobe
ckxkobe   2017.11.14 22:40

图片说明顺序表

ckxkobe
ckxkobe   2017.11.14 22:40

图片说明顺序栈

ckxkobe
ckxkobe   2017.11.14 22:41

图片说明链表

rdguo
rdguo   2017.11.14 22:49

第一个的是给双链表的内存吧,如果超出了就会ERROR

ckxkobe
ckxkobe 谢谢回答。主要是不明白在单链表操作中,malloc不检查返回值的原因。
7 天之前 回复
qq_36112576
qq_36112576   2017.11.15 08:01

1、malloc用于分配储存空间 当分配成功返回bool型1 分配失败返回bool型0 ,!return error也就是说只有分配空间成功才有必要执行下去。
2、exit()返回错误信息,exit(0)是正常返回 ,不受限于返回类型,return()返回函数值,受限于函数的返回类型.

qq_36112576
qq_36112576 回复ckxkobe: 看ranyixu11的解释 我的理解有问题 带来不好影响抱歉啦
7 天之前 回复
ckxkobe
ckxkobe 谢谢回答。但是还是不明白,在单链表操作中,malloc不检查返回值的原因。是因为单链表所开辟的空间较小,所以没必要检查吗?
7 天之前 回复
ranyixu11
ranyixu11   2017.11.15 15:27

谁说的malloc返回的是bool型,malloc返回的是void*类型,分配成功返回的是分配的内存地址,分配失败返回的是NULL,只是指针类型可以进行逻辑运算而已

ranyixu11
ranyixu11   2017.11.15 15:42

Mr_dogyang这位完全是乱讲,exit表示的是退出进程,程序终止。 return表示的是函数返回,终止函数的运行,return的返回值类型与函数声明类型必须一样,如果函数声明返回值为void,return后面不用加返回值。
void my_printf(int a)
{
if(a<0)
return;
printf("%d\n", a);
}

void my_printf1(int a)
{
if(a<0)
exit(0);
printf("%d\n", a);
}

//call my_printf
int main(void)
{
my_printf(-1);//-1小于0,因此不会有输出,但是程序会继续执行下面的函数。
my_printf(3);//输出: 3
}

//call my_printf1
int main(void)
{
my_printf1(-1);//-1小于0,进程会退出,所有后面的代码都不会被执行。
my_printf1(3);//永远不会执行
}

tjl121314
tjl121314   2017.11.15 17:11

return跟exit区别差不多就是ranyixu11 说的那样,
malloc()封装了mmap()函数,mmap()最低给了malloc() 33块.一块4k大小,一般是不太会出现分配失败,但是当内存不足的时候肯定会出现失败,返回NULL指针

共11条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片