首页 > 试题广场 >

32位系统下下面程序的输出结果为多少?

[单选题]
void Func(char str_arg[100]){
    printf("%d\n", sizeof(str_arg));
}
int main(void){
    char str[] = "Hello";
    printf("%d\n", sizeof(str));
    printf("%d\n", strlen(str));
    char*p = str;
    printf("%d\n", sizeof(p));
    Func(str);
}
32位系统下下面程序的输出结果为多少?
  • 5 5 4 4
  • 6 5 4 4
  • 6 5 6 4
  • 5 5 5 100
推荐
输出结果为:6 5 4 4
对字符串进行sizeof操作的时候,会把字符串的结束符"\0"计算进去的,进行strlen操作求字符串的长度的时候,不计算\0的。
数组作为函数参数传递的时候,已经退化为指针了,Func函数的参数str_arg只是表示一个指针,那个100不起任何作用的。
编辑于 2015-02-03 14:27:59 回复(15)
  1. str是复合类型数组char[6],维度6是其类型的一部分,sizeof取其 维度*sizeof(char),故为6;
  2. strlen 求c类型string 的长度,不含尾部的'\0',故为5;
  3. p只是个指针,32位机上为4;
  4. c++中不允许隐式的数组拷贝,所以Func的参数会被隐式地转为char*,故为4;

note:若Func的原型为void Func(char (&str_arg) [6])(若不为6则调用出错),则结果为6.
发表于 2016-10-04 13:43:29 回复(4)
32位机器上, 任何指针变量都只占4个字节。 64位机器则是8个字节。
发表于 2015-02-23 21:56:05 回复(2)
前面的两个基本都能够答对 在还是在第三个的时候 转化为指针时 p只是一个指针 在32位机器上占4个字节 
发表于 2016-03-03 15:49:15 回复(0)
都是什么栏解析
第一个长度,是实际数组的长度5个字符,一个隐式的‘\0’编译会分配6个字节
第二个长度,标准的C库函数,返回字符串实际长度,那么是5个字符
第三个长度,是一个指针的长度,就是计算机系统的地址长度,32位机器 4字节
第四个和第三个同理,形参传递数组,传递的是数组首地址
发表于 2017-10-24 15:11:55 回复(3)
1.C语言的字符串以‘\0’作为结尾,当使用sizeof的时候,会将结尾符计算进去,因此是5;
2. strlen函数专门用来计算字符串,因此忽略了'\0',所以大小为4;
3.传入的是一个指针,在32位系统之下,一个指针的大小为4字节;
4.当数组被作为参数传递的时候,实际函数得到的是数组的首元素的地址指针,本质是指针,所以大小和第三个一样;
发表于 2016-08-18 21:48:36 回复(0)
答案为 B,解析:
char str[]="Hello"; 实际上分配的是 6 字节的存储空间: H e l l o \0 
因此 sizeof(str) 输出 6。
strlen(str) 统计 \0 前的字符数,因此输出 5。
sizeof(p) 实际上计算的是 char * 指针的大小。(通常来说 32 位机器上为 4,64位机器上为 8)
Func(str); 虽然 Func 的形参定义为 char str_arg[100] ,但是其实际上被处理为 char *,因此 Func 内的 sizeof 实际上计算的是 char * 指针的大小。(关于数组形参的介绍可参见 C++ primer )
发表于 2021-09-04 13:22:53 回复(1)
数组作为函数参数传递的时候,已经退化为指针
发表于 2016-02-23 10:02:27 回复(0)
最后一个4是因为str传到函数中退化为指针。
这样理解应该没错吧?
发表于 2015-03-24 14:55:30 回复(1)

Sizeof()

这个函数的作用是求出参数所占的字节数,

1、如果参数是个普通的数据类型,他就求数据类型的字节数

2、如果参数是个指针,那就求一个指针所占的字节数(32位系统下为4,64位系统下为8)

3、如果参数是个数组,那就要用 数据类型的字节数*数组宽度

对于char a[] = "abc";,sizeof(a)为啥是4呢?因为字符串的末尾有个隐藏的\0

发表于 2020-10-13 22:40:05 回复(0)
void Func(char str_arg[100])
{
       printf("%d\n",sizeof(str_arg));
}
int main(void)
{
     char str[]="Hello";
     printf("%d\n",sizeof(str));//字符串没有作为函数参数,所以直接使用sizeof求字符串大小时,把'\0'也算进去了,结果是5+1=6
    printf("%d\n",strlen(str));//使用strlen计算时,结尾的'\0'是不计算的,所以 = 5
    char*p=str;
    printf("%d\n",sizeof(p));//p是一个指针类型,指针类型算一个int大小
    Func(str);//字符串作为函数参数,退化为指针,所以再用sizeof计算时,也是一个int的大小
}

发表于 2021-07-01 17:25:35 回复(0)
Func函数的参数str_arg只是表示一个指针,那个100不起任何作用的
发表于 2020-06-02 08:58:54 回复(0)
sizeof运算符 既可以作用于字符串,也可作用于内置类型和自定义类型, 用于字符串时,返回字符串所占内存空间的大小, str[100]是100个字节,str[]="Hello"是6个字节(包括自动补上的'\0')

strlen是字符串测长函数,不是运算符,参数只能是字符串或指向字符串的指针,函数返回字符串不包含 '\0'部分 的实际长度, strlen作用于str[100]= "Hello"、 str[]="Hello"的返回值都是5 (strlen函数停止计数的条件是首次遇到 '\0',因此,strlen("abc\0edf\0")的值是3,而不是6 )

字符串作为参数传递给子函数时,子函数接受到的是指向字符串的指针, 32位机器上, 任何指针变量都只占4个字节。 64位机器则是8个字节,因此无论字符串如何变化, 调用sizeof(char*)后返回的都是4



发表于 2017-05-18 15:54:02 回复(0)
6 5 4 4 对字符串进行sizeof操作的时候,会把字符串的结束符"\0"计算进去的,进行strlen操作求字符串的长度的时候,不计算\0的。 数组作为函数参数传递的时候,已经退化为指针了,Func函数的参数str_arg只是表示一个指针,那个100不起任何作用的。
发表于 2023-07-31 16:15:14 回复(0)
sizeof如果要判断长度则要加一,而strlen则不变,指针占的字节大小都是4
发表于 2023-03-09 13:37:04 回复(0)
sizeof(数组)求的是数组长度,sizeof(指针)求的是指针变量在内存中占用的字节数量。
发表于 2022-03-20 16:11:38 回复(0)
这题就tm不对吧,sizeof和strlen输出的值能一样? sizeof的大小是包含了\0的,strlen的大小则忽略\0
发表于 2022-03-04 08:07:19 回复(0)
数组和指针是有区别的,数组是由头指针与数组长度等组成的,而指针就是一个长度为4的指针
发表于 2021-10-28 21:41:58 回复(0)
数组作为函数参数传递时会退化为指针
发表于 2021-07-06 21:11:02 回复(0)
sizeof会包括\0而stolen不会包括
发表于 2021-07-02 16:45:07 回复(0)
这道题的考察的知识点和第6题的相同:sizeof(数组名) = 数组占字节数大小,而sizeof(指针变量) = 指针变量占字节数大小。当一个数组作为函数参数时,其等价于指针。
发表于 2021-04-20 23:22:38 回复(0)