新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正
经常看到有人说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://c-faq.com/malloc/mallocnocast.html
文章结束给大家分享下程序员的一些笑话语录: 自行车
一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。