关于strlen()这个函数

hxblvc 2004-03-18 11:05:09
请看下边代码:
///============================================
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太让人不    相信了,那应该 用什么才能真正得到一个内存块的长度啊!!!
...全文
80 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxblvc 2004-03-24
  • 打赏
  • 举报
回复
谢谢大家
Cocoky 2004-03-19
  • 打赏
  • 举报
回复
debug和release版的结果不一样
Cocoky 2004-03-19
  • 打赏
  • 举报
回复
原因如下:
strlen()得到的是以\n结束的字符串长度(除去\n占用的一个字符),而你str1[10]没有以\n结束,所以不正确,而且很危险
JetKingLau 2004-03-19
  • 打赏
  • 举报
回复
bool float int等类型会有一个初始值(缺省值),但对于char *则没有,未赋值前得到的是随机的。
zhuyie 2004-03-19
  • 打赏
  • 举报
回复
to fvv(守护者):

char str1[10];
char str2[10];
char str3[10];

如果它们是在栈里分配的,那么它们是连续的。
nnfish 2004-03-19
  • 打赏
  • 举报
回复
up
sailor_2002 2004-03-19
  • 打赏
  • 举报
回复
strlen是求字符串的长度,一般做法是把字符串长度作为参数,同意snowroad的说法
GoldWood 2004-03-19
  • 打赏
  • 举报
回复
关注
snowroad 2004-03-19
  • 打赏
  • 举报
回复
同意ukyoking(累) ,如果你需要知道长度,就要把长度做为参数传进来,这是现在流行的做法,可以让你写出不产生泄漏的程序。格式是:
void fun(void* str, int nSize)
flinming 2004-03-19
  • 打赏
  • 举报
回复
char str[] = “Hello” ;
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
ymbymb 2004-03-19
  • 打赏
  • 举报
回复
如果是一个数组可以通过sizeof得到长度
char a[100];
sizeof(a) 等于 100;
但是如果你是动态分配的内存,你只能在分配的时候记住其大小
char *p = new char[100];
sizeof(p) 等于 4;
sunyanbiao_12 2004-03-19
  • 打赏
  • 举报
回复
是呀,你总有个内存结束标志吧!!!
ukyoking 2004-03-19
  • 打赏
  • 举报
回复
你这个函数设计的稍烂了一点:),如果你传一个指针过来,sizeof 只能得到 4(win98se, vc6);strlen是用来计算字符串长度的,不是用来计算内存块大小,建议你认真复习一下各函数的功能。

按照你的要求,传一个内存块尺寸做参数会是一个比较好的解决办法,你在调用fun的时候总该知道分配了多少内存。

void fun(void* str, int nSize)
{
//在这里我们只知道str是一块内存的起始地址
         //这时我们应该如何得到str的长度啊
//str指向的可能是 一个char str[10],也可能是 int str[10],
         //也可能是 malloc(10) 等等
}
mjm_d 2004-03-19
  • 打赏
  • 举报
回复
strlen是检查字符串长度 我不清楚是否做边界检查 如果你要看看你的数组有多大可以使用
sizeof();
不过它是编译期的,不支持动态 而且作为参数就弱化了
zhaoriyue 2004-03-19
  • 打赏
  • 举报
回复
fvv(守护者) 说得没有错.
因为strlen是碰到一个'\0'才会认为字符串结束的.而第一个字符数据组没有赋初值,所以它的内容不定,得到的数据可能是越界的.
你可以用*(str1+15)来看一下这个值是不是'\0'以验证其正确性.
nkwesley 2004-03-19
  • 打赏
  • 举报
回复
同意fvv(守护者)
hxblvc 2004-03-19
  • 打赏
  • 举报
回复
晕,等了一晚上还没得到答案
hxblvc 2004-03-19
  • 打赏
  • 举报
回复
可是,我们面对的问题是要求一个 不知道类型(void*),不知道数量,没有初始化 的内存块啊,如:我如果将str1传给一个函数:
///........................
.
.
void fun(void* str)
{
//在这里我们只知道str是一块内存的起始地址
         //这时我们应该如何得到str的长度啊
//str指向的可能是 一个char str[10],也可能是 int str[10],
         //也可能是 malloc(10) 等等
}
.
.
///.............................
bluebohe 2004-03-19
  • 打赏
  • 举报
回复
对于这类数组就直接sizeof就好
hxblvc 2004-03-19
  • 打赏
  • 举报
回复
这我明白,不过不知道有没有更好的方法来得到一个内存块的大小
加载更多回复(9)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧