您的位置:首页 > 编程语言 > C语言/C++

函数返回值C语言中malloc函数返回值是否需要类型强制转换问题

2013-05-09 19:37 211 查看
新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正

经常看到有人说C言语中malloc函数的返回值不要用强制类型转换. 近来看到了这个帖子http://stackoverflow.com/questions/7545365/why-does-this-code-segfault-on-64-bit-architecture-but-work-fine-on-32-bit, 终于是懂原因了. 做个结总如下:

1. 在C言语中, 如果调用的函数没有函数型原, 则其返回值将默以为 int 型.

虑考调用malloc函数时忘记了 #include <stdlib.h>的况情

此时malloc函数返回值将为 int 而不是void * (这是C言语的规矩, 有所没有函数型原的函数返回值都为int), 此时如果在程序中有如下语句

int *p =  malloc(10);

则译编器会给出正告, ``assignment of pointer from integer lacks a cast'' ( 该应是较早本版的译编器, 最新的译编器如gcc中, 如果函数型原没有显式的给出, 则会给出正告"warning: implicit declaration of function ‘malloc’", 所以其实只要忘了 #include <stdlib.h> 译编器就会给正告了), 如果此时是如下语句

每日一道理

“一年之计在于春”,十几岁的年纪,正是人生的春天,别辜负了岁月老人的厚爱与恩赐。行动起来,播种梦想吧!

int *p = (int *) malloc (10);

则会将 malloc 的返回值 int 强制转换为向指int类型的指针, 此时译编器不给出``assignment of pointer from integer lacks a cast'' 的正告(实际上在现的译编器会因为malloc函数没有声明函数型原而给出正告), 但这样的转换有可能会带来问题.

2. 在C++中, 如果不对malloc函数的返回值行进表现的强制类型转换, 则译编会错出.

上面的语句

int *p =  malloc(10);

在.c件文中以C言语语法译编不会报错, 够能通过, 但如果改成.cpp件文以C++语法译编则会报错 " error: invalid conversion from ‘void*’ to ‘int*’ ", 由此可以看出C++的语法检查更严厉一点. 不过在C++中更该应用new来分配内存, 而不是malloc.

所以最好的方法该应是在C言语中malloc函数用不强制类型转换, 但如果程序虑考到C++的兼容性的话, 那该应应用强制类型转换, 而在C++程序中该应用new来替代malloc分配内存.

参考:

http://stackoverflow.com/questions/7545365/why-does-this-code-segfault-on-64-bit-architecture-but-work-fine-on-32-bit

http://c-faq.com/malloc/mallocnocast.html

文章结束给大家分享下程序员的一些笑话语录:

自行车

一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”

骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。

另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐