首页 > 试题广场 >

下面程序的输出结果为多少?

[单选题]
下面程序在 32 位机器上的输出结果为多少?
#include <stdio.h>
#include <string.h>
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);
}

  • 5 4 4 4
  • 6 5 4 4
  • 5 5 5 5
  • 5 5 5 4
推荐

输出结果为:6 5 4 4

对字符串进行sizeof 操作的时候,会把字符串的结束符“\0”计算进去的,进行strlen 操作求字符 串的长度的时候,不计算\0 的。 数组作为函数参数传递的时候,已经退化为指针了,Func 函数的参数str_arg只是表示一个指 针,那个100不起任何作用的。

编辑于 2014-12-29 22:20:41 回复(0)
发表于 2015-03-29 11:26:07 回复(2)
第一个就可以判断了,有个“/0”
发表于 2021-09-07 15:47:55 回复(0)
sizeof和strlen()都可以用来统计字符串所占用的大小,二者的区别为:
  1. sizeof是运算符,而strlen是函数;
  2. strlen必须以char *作为参数,且必须以'\0'结尾;而sizeof()可以用于其他类型;
  3. strlen统计字符串中字符的长度,不包括结尾的'\0';
  4. 数组做sizeof的参数不退化,而传递给strlen就变为指针
sizeof(str):占用的字节为5 + 1 = 6,其中1为末尾的'\0';
strlen(str):5
sizeof(p):计算的是指针的长度,32位机器上为4B
Func(str):传递的是指针,大小为4

发表于 2015-08-28 22:27:09 回复(2)
数组做参数会退化为指针
发表于 2017-03-19 20:33:44 回复(0)
sizeof是运算符,输出的是变量的存储空间的大小。一个英文字符占一个字节,另外字符串的结尾要有null结束符,因此,"Hello"占了6个字节;
strlen输出的是字符串的长度,因此为5
p是指针,32位系统中内存地址的长度是4字节,因此sizeof(p)为4
Func(str)中,数组以指针形式输入到函数空间中,因此sizeof(str)为4
编辑于 2016-09-17 11:34:12 回复(0)
6
5
8
8
发表于 2014-11-26 16:29:02 回复(2)
B
sizeof(str)是数组大小,数组创建时为hello长度加截止符
函数参数为数组的话,会转换为指针
发表于 2015-04-10 10:07:18 回复(0)
sizeof和strlen()都可以用来统计字符串所占用的大小,二者的区别为:
  1. sizeof是运算符,而strlen是函数;
  2. strlen必须以char *作为参数,且必须以'\0'结尾;而sizeof()可以用于其他类型;
  3. strlen统计字符串中字符的长度,不包括结尾的'\0';
  4. 数组做sizeof的参数不退化,而传递给strlen就变为指针
sizeof(str):占用的字节为5 + 1 = 6,其中1为末尾的'\0';
strlen(str):5
sizeof(p):计算的是指针的长度,32位机器上为4B
Func(str):传递的是指针,大小为4
发表于 2018-07-10 10:14:01 回复(0)
strlen是一个函数,就是计算字符串的长度。 
而 sizeof 是操作符,是计算占用的空间大小,字符串末尾的 \n 也是要计算进去的。
对于参数,数组名就会自动变成指针 ,在32位系统中,指针的大小就是4个
发表于 2017-09-11 15:52:22 回复(1)
6
5
4
4
char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。  
上面是对静态数组处理的结果,如果是对指针,结果就不一样了
char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是

发表于 2014-12-04 10:07:26 回复(0)
May头像 May
程序错误,没有返回值
发表于 2014-11-04 21:12:07 回复(0)
sizeof为求字节运算符,sizeof(str)求字符串的字节数包括最后的\0,所以sizeof(str)=6,而strlen(str)求的是字符串的实际长度,不包括\0,所以strlen(str)=5,p为指针变量,32位机器占字节为4,当数组作为函数参数时实际就退化为指针,所以Func(str)----->sizeof(str_arg)=4.
发表于 2019-02-21 15:46:12 回复(0)
字符串要计算结尾符号,所以为6,strlen不计算,后面的数组被转化为指针,且最后作为函数参数传递时会退化为指针,所以长度都为4
发表于 2024-06-25 17:02:12 回复(0)
指针作数组名会弱化为指针,指针是4个字节
编辑于 2023-03-25 16:13:13 回复(0)
这里就是想说,数组被当做参数传入函数时会退化为指针。
发表于 2022-08-13 17:36:05 回复(0)
Sizeof 返回字符串大小,也就包括了结束字符。而strlen 返回字符串长度。在这里就是5。32位系统中指针占4个字节。最后传入Func 函数的数组退化为指针,也是4字节。这是我的理解
发表于 2022-06-01 10:56:14 回复(0)
稍微总结一下,数组作为sizeof参数时计算的便是数组的大小,指针作为sizeof的参数时计算的是指针的大小,也就是4字节(32位下),strlen的参数只能是char *。
发表于 2022-04-11 22:26:36 回复(0)
数组作为函数参数传递时会退化为指针!!!
发表于 2020-10-07 19:47:50 回复(0)
当时我觉得第1个和最后一个的长度应该是一样的,然后就蒙了一个答案C……, sizeof在测试字符串长度时会加上'\0',而strlen不会。所以第1个是6,第2个是5,第3个测量是指针的长度,在64位系统中,按理来说,指针所占字节数应该是8,32位系统指针所占字节数为4,但是为什么有时候在64位系统下sizeof(p)所测得指针所占字节数是4呢,百度了一下有大神说,因为我们是在64位系统下运行的是32位的程序,也有说是为了相互兼容。不太清楚,先记录一下。然后最后一个答案,传入的也是地址,所以对应测得的结果也是4。
发表于 2020-04-12 18:33:35 回复(0)
数组名做参数 会退化为指针。。。。
编辑于 2018-03-20 19:46:18 回复(0)