请看下边代码:
///============================================
char str1[10];
char str2[10];
char str3[10];
str2[0]='\0';
str3[9]='\0';
cout<< "str1的长度: " << strlen(str1) <<endl;
cout<< "str2的长度: " << strlen(str2) <<endl;
cout<< "str3的长度: " <<strlen(str3) <<endl;
///=============================================
输出:
str1的长度: 15
str2的长度: 0
str3的长度: 9
晕,这太让人郁闷了,想不通了,高手请解说一下,不过,现在strlen太让人不 相信了,那应该 用什么才能真正得到一个内存块的长度啊!!!
///============================================
char str1[10];
char str2[10];
char str3[10];
str2[0]='\0';
str3[9]='\0';
cout<< "str1的长度: " << strlen(str1) <<endl;
cout<< "str2的长度: " << strlen(str2) <<endl;
cout<< "str3的长度: " <<strlen(str3) <<endl;
///=============================================
输出:
str1的长度: 15
str2的长度: 0
str3的长度: 9
晕,这太让人郁闷了,想不通了,高手请解说一下,不过,现在strlen太让人不 相信了,那应该 用什么才能真正得到一个内存块的长度啊!!!
解决方案 »
- 创建一个mfc的对话框工程,对话框会自动生成俩个,一个带有版本信息的对话框怎么运行程序才可以显示出来?
- VC开发ATL时如何修改tlb文件的生成目录
- 怎样复制光标图片到VC程序中?
- 更改对话框属性如何用代码实现
- P2P 关于NAT类型的问题?
- 如何实现IP包转发
- tooltip 在有的机器上无法显示,是什么原因
- 帮帮我呀!!!用ODBC操作Sql Server数据库,提示“记录集是只读”???怎么才有写的权限???
- DAO怎样Access表中的某一项值赋给编辑框
- 多线程 如果不想让连接保持,每次都建立新的连接,是在哪个函数里设置
- 如何用StretchBlt函数实现图像从屏幕左端移到右端?
- 有关GetPrivateProfileSection的问题
char str1[10];
char str2[10];
char str3[10]; str1 str2 str3在内存中不一定是连续的.
char str2[10];
char str3[10]; 如果它们是在栈里分配的,那么它们是连续的。
char str2[10];
char str3[10];
str2[0]='\0';
str3[9]='\0';这里没有为str1数组赋初值,可以认为strlen从当前地址(比如&str1[0])开始寻找第一个等于0(也就是'\0')的位置,返回经历的字节数目,现在你应该明白了吧。如果是release版本可能得数也不是15呢
///........................
.
.
void fun(void* str)
{
//在这里我们只知道str是一块内存的起始地址
//这时我们应该如何得到str的长度啊
//str指向的可能是 一个char str[10],也可能是 int str[10],
//也可能是 malloc(10) 等等
}
.
.
///.............................
因为strlen是碰到一个'\0'才会认为字符串结束的.而第一个字符数据组没有赋初值,所以它的内容不定,得到的数据可能是越界的.
你可以用*(str1+15)来看一下这个值是不是'\0'以验证其正确性.
sizeof();
不过它是编译期的,不支持动态 而且作为参数就弱化了
{
//在这里我们只知道str是一块内存的起始地址
//这时我们应该如何得到str的长度啊
//str指向的可能是 一个char str[10],也可能是 int str[10],
//也可能是 malloc(10) 等等
}
char a[100];
sizeof(a) 等于 100;
但是如果你是动态分配的内存,你只能在分配的时候记住其大小
char *p = new char[100];
sizeof(p) 等于 4;
char *p = str ;
int n = 10;sizeof (str ) = 6
sizeof ( p ) = 4
sizeof ( n ) = 4
void Func ( char str[100])
{sizeof( str ) = 4 }
void *p = malloc( 100 );
sizeof ( p ) = 4
void fun(void* str, int nSize)
strlen()得到的是以\n结束的字符串长度(除去\n占用的一个字符),而你str1[10]没有以\n结束,所以不正确,而且很危险