- 论坛徽章:
- 0
|
char *getMem()
{
char *p;
p = malloc(100);
return p;
}
int main(void)
{
char *p = getMem();
sprintf( p, "hello" );
free(p);
}
这段代码会有什么错误
我答的是申请内存后未判空,直接用sprintf写入会有问题
对方说这不是问题所在。我想了一下malloc申请的内存虽然没有初始化为0,但是sprintf写入也不应该有问题。
对方说c的基础太差了,郁闷
=====================
请教下各位这段代码到底有什么严重问题。
=====================
跟头文件包含无关
在main中即使没有显示的调用return或者exit程序也会正常的退出。
void *malloc(size_t size);
这是malloc函数的原型,功能为申请size个字节的内存,初始值不确定。malloc(100),malloc( 100 * sizeof(char) ) 效果无区别。
sprintf确实是不安全的,没有任何绝对的方法能够保证内存不溢出。
#20楼,free只是释放掉p指向的内存以供回收再使用,可是p的地址没有改变,你打出的来的当然还是这个地址上面的值
#43楼,你的意思是说调用getMem之后p地址不再是malloc申请的地址,这样就写入了未知的地址吗?
刚才写程序测试了一下,getMem里面的p的地址和main调用getMem的地址是一样的。是不是调用getMem之后p的地址已经被系统释放掉了?
刚才写程序用gdb调式看了一下,getMem后p的返回值正常,不是野指针。即使多写几个子函数踩掉栈帧,内部变量p被破坏,但其返回的所指向的内存地址是正确的。
用valgrind程序测试未发现错误和内存泄漏问题。那些说内存泄漏和返回为野指针的朋友能够把问题说的详细点吗?为何从getMem返回的p是野指针?
========================================
不好意思各位,这个帖子已经被顶到这么高了。
帖子里面很多朋友说从getMem返回后内存被自动释放掉,或者返回的p为野指针。我想把这个问题确认一下就可以关帖了。
我写程序测试过返回的p是正常的,而且用内存检测工具检测过未发现内存泄漏的情况。请那些提出此问题的朋友详细讲解下好吗?
========================================
谢谢大家的帮忙,大家看完帖子已经有了答案。内存泄漏和野指针的问题应该被澄清。再次谢谢大家
怎么关闭帖子?
[ 本帖最后由 bgifu 于 2009-12-4 09:41 编辑 ] |
|