题目1(腾讯11年笔试题):
#include <stdio.h>
#include <string.h>
void func(char str_arg[100])
{
printf("\nstr_arg = %s\n", str_arg);
printf("sizeof(str_arg) = %d\n", sizeof(str_arg));
printf("strlen(str_arg) = %d\n", strlen(str_arg));
}
int main()
{
char str[] = "Hello";//注意和char * str = "Hello";是不一样的结果
printf("str = %s\n", str);
printf("sizeof(str) = %d\n", sizeof(str));
printf("strlen(str) = %d\n", strlen(str));
char * p = str;
printf("\np = %s\n", p);
printf("sizeof(p) = %d\n", sizeof(p));//linux 64位系统下,指针的长度是8字节,但是windows 64位系统下,指针的长度是4字节
printf("strlen(p) = %d\n", strlen(p));
func(str);
return 0;
}
str = Hello
sizeof(str) = 6
strlen(str) = 5
p = Hello
sizeof(p) = 8
strlen(p) = 5
str_arg = Hello
sizeof(str_arg) = 8
strlen(str_arg) = 5
题目2(腾讯11年笔试题):
#include <stdio.h>
#include <string.h>
void func(char str_arg[2])
{
printf("\nstr_arg = %s\n", str_arg);
printf("sizeof(str_arg) = %d\n", sizeof(str_arg));
printf("strlen(str_arg) = %d\n", strlen(str_arg));
}
int main()
{
char str[] = "Hello";
func(str);
return 0;
}
输出:
str_arg = Hello
sizeof(str_arg) = 8
strlen(str_arg) = 5
例子3:静态数组
#include <stdio.h>
#include <string.h>
int main()
{
char * str = "Hello";
printf("str = %s\n", str);
printf("sizeof(str) = %d\n", sizeof(str));
printf("strlen(str) = %d\n", strlen(str));
char * p = str;
printf("\np = %s\n", p);
printf("sizeof(p) = %d\n", sizeof(p));//linux 64位系统下,指针的长度是8字节,但是windows 64位系统下,指针的长度是4字节
printf("strlen(p) = %d\n", strlen(p));
return 0;
}
输出:
str = Hello
sizeof(str) = 8
strlen(str) = 5
p = Hello
sizeof(p) = 8
strlen(p) = 5
例子4:动态数组
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char * str = new char[10];
cout << "str = " << str << endl;
cout << "sizeof(str) = " << sizeof(str) << endl;
cout << "strlen(str) = " << strlen(str) << endl;
cout << endl;
str = "Hello";
cout << "str = " << str << endl;
cout << "sizeof(str) = " << sizeof(str) << endl;
cout << "strlen(str) = " << strlen(str) << endl;
return 0;
}
输出:
str =
sizeof(str) = 8
strlen(str) = 0
str = Hello
sizeof(str) = 8
strlen(str) = 5
总结:
1. Linux和Windows不同位数的系统指针的长度不同
在题目1中可以看到指针的长度是8个字节,本程序是在ubuntu64位系统下面输出的结果。
如果是linux32位系统指针的长度是4个字节,在windows32位和64位系统下指针的长度都是4个字节。
sizeof(p) = 8
sizeof(str_arg) = 8
2.对字符串进行sizeof操作的时候,会把字符串的结束字符'\0'计算进去,进行strlen操作求字符串的长度不把结束字符'\0'计算进去。sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。strlen只关心存储的数据内容,不关心空间的大小和类型。
在例子3和例子4中, str是一个指针不是一个数组,所以sizeof(str) = 8;但是strlen(str) = 5;
str = Hello
sizeof(str) = 6
strlen(str) = 5
4.数组作为函数参数传递的时候已经退化为指针了,func函数的参数str_arg只是表示一个指针,sizeof对指针求长度就是该指针变量本身的长度大小。(本系统指针长度为8个字节)
题目1中的p也是一个指针变量,所以sizeof(p) = 8;
具体还可参考:
http://blog.csdn.net/21aspnet/article/details/1539951
http://zhidao.baidu.com/link?url=G9BNVvK7_pojawc3RdWvWv_pPZWmb5E1au9XfMVSuKMNk8hGqsfjKQakJc_q1pmQBOHkB0-Tvx-p5mnMSs1kTq
http://blog.163.com/pengfeicui@yeah/blog/static/106403250201010793412165/