strlen 和 sizeof 的问题,求高手指点?
[b]曾经在论坛的一个帖子上看到这个题,不是很确定,自己测试了一下,就出现了问题,求高手们指点一下:
(用的是g++编译)
原来帖子链接:
http://topic.csdn.net/u/20120227/13/98ecafd0-a2e6-4714-aa90-abc355a85e94.html?seed=2122165957&r=77739973#r_77739973
这个是我的测试代码:
[code=C/C++][/code]
#include <iostream>
#include <cstring>
using namespace std;
void count ( char * string){
int a = strlen (string);
int b = sizeof (string);
cout <<"the value is :"<< a << "\t" << b << endl;
}
int main() {
char string1[] = {0x01, 0x02, 0x03};
char string2[] = {0x01, 0x00, 0x03};
char string3[20] = {0x01, 0x02, 0x03};
char string4[20] = {0x01, 0x00, 0x03};
count (string1);
count (string2);
count (string3);
count (string4);
return 0;
}
测试结果:
[code=C/C++][/code]
the value is :6 8
the value is :1 8
the value is :3 8
the value is :1 8
strlen的结果能理解,但是sizeof的结果可就不是很好理解,和大家想的都不一样,不是20!而且把数组的20换成50,结果不变!
tell me why?[/b]
[解决办法]
因为你只是把数组地址传了过去,而没把整个数组传过去...
定义函数最好为void print(char *p, int n); //n为数组大小
下面是sizeof操作结果:
#include <stdio.h>int main() { char string1[] = {0x01, 0x02, 0x03}; char string2[] = {0x01, 0x00, 0x03}; char string3[20] = {0x01, 0x02, 0x03}; char string4[20] = {0x01, 0x00, 0x03}; printf("%d\n", sizeof(string1));//结果是3 printf("%d\n", sizeof(string2));//结果是3 printf("%d\n", sizeof(string3));//结果是20 printf("%d\n", sizeof(string4));//结果是20 return 0;}
[解决办法]
我晕,你写的什么代码咯。
你传进去的是指针,
当然每个sizeof的值相同了,
应该都是4
[解决办法]
#include <iostream>#include <cstring>using namespace std;int main() { char string1[] = {0x01, 0x02, 0x03}; char string2[] = {0x01, 0x00, 0x03}; char string3[20] = {0x01, 0x02, 0x03}; char string4[20] = {0x01, 0x00, 0x03}; int a = 0; int b = 0; a = strlen(string1); b = sizeof(string1); cout<<a<<" "<<b<<endl; a = strlen(string2); b = sizeof(string2); cout<<a<<" "<<b<<endl; a = strlen(string3); b = sizeof(string3); cout<<a<<" "<<b<<endl; a = strlen(string4); b = sizeof(string4); cout<<a<<" "<<b<<endl; system("pause"); return 0;}
[解决办法]
这是因为
void count ( char * string){ //此时string是个指针了
int a = strlen (string);
int b = sizeof (string);
cout <<"the value is :"<< a << "\t" << b << endl;
}
sizeof(string)是对指针的取字节,永远都是4
你可以试试其他类型的,即时是int double float,他们的结果也都会是4
当数组名用作参数传递给一个函数时,这个数组名已经退化成一个指针,不能再用sizeof取得整个数据的长度了。
所以经常在函数的形参列表中,需要传递数组的时候,第一个参数是数组名,而第二个参数就是数组的长度了,这已经是一个习惯了。楼主可以看看其他的程序,你会发现这样的写法是很普遍的。
void fun ( int *arry, int length)//经常是以这种搭配出现
{
int result = sizeof(arry);
//结果一定等于 4
}
还有 char *string string 是关键字,最好不要这样定义为一个变量名