new与malloc的奇怪问题?
2013-04-05 11:23
225 查看
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char* p1 = "abcdefg12345678";
char* p2 = new char(19);
char* p3 = (char*) malloc(18);
fprintf( stdout, "%d\n", strlen( p1) );
fprintf( stdout, "%d\n", strlen( p2) );
fprintf( stdout, "%d\n", strlen( p3) );
strcpy( p2, p1 );
fprintf( stdout, "p1=%s\tp2=%s\n", p1 ,p2 );
fprintf( stdout, "%d\n", strlen( p2) );
return 0;
}
用vs2012编译运行,结果如下,为什么?
自己的理解:其实这里strlen输出任何值都是有可能的,因为new和malloc只是分配了空间,里面有值是不确定的,strlen只是一个函数,它只管求长度,一旦遇到\0就结束。经实验发现,如果把某位设置成\0,则返回的长度就到此位为止。除此之外,new好像还有一种特殊的机制:新分配内存的第一位会是总长度。
#include<string.h>
#include<stdlib.h>
int main()
{
char* p1 = "abcdefg12345678";
char* p2 = new char(19);
char* p3 = (char*) malloc(18);
fprintf( stdout, "%d\n", strlen( p1) );
fprintf( stdout, "%d\n", strlen( p2) );
fprintf( stdout, "%d\n", strlen( p3) );
strcpy( p2, p1 );
fprintf( stdout, "p1=%s\tp2=%s\n", p1 ,p2 );
fprintf( stdout, "%d\n", strlen( p2) );
return 0;
}
用vs2012编译运行,结果如下,为什么?
自己的理解:其实这里strlen输出任何值都是有可能的,因为new和malloc只是分配了空间,里面有值是不确定的,strlen只是一个函数,它只管求长度,一旦遇到\0就结束。经实验发现,如果把某位设置成\0,则返回的长度就到此位为止。除此之外,new好像还有一种特殊的机制:新分配内存的第一位会是总长度。
相关文章推荐
- 经典问题解析(2)---malloc和new、编译器和构造函数、静态成员
- new和malloc的地址分配问题
- new 与malloc问题
- 处理malloc()和new时内存耗尽问题
- c/c++ new与malloc的区别及使用时注意的问题
- C# 删除自己new的控件是,不能直接调用控件的Dispose否则有奇怪的问题
- C++知识点随笔(四):耦合问题、new和malloc、虚析构、多继承
- VC++6.0&&VS2008&MFC&API学习问题总结(二)(malloc/new/OnReceive)
- 奇怪的malloc问题!
- 关于new 与 malloc的一个问题
- 问题:在编程中为了防止内存泄漏是不是只要malloc或者new都有对应的free和delete就不会有内存泄漏
- C++中的基础问题——virtual destructor问题,new与malloc区别
- C++中new(delete)和malloc(free)的常见问题
- malloc和new的区别
- 静态库编译和连接遇到的奇怪问题
- 【C++】默认实参的定义,malloc改成new
- 奇怪的Exchange 2010 崩溃问题!
- 【每日一C之六】new 与 malloc
- xp重装后奇怪的问题ping不通本机ip不能访问局域网
- C++中malloc和new的区别简单介绍