首页 > 试题广场 >

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

[单选题]
下面程序的输出结果为多少(32位机器上)?
void Func(char str_arg[2])
{
    int m = sizeof(str_arg); 
    int n = strlen(str_arg); 
    printf("%d\n", m);
    printf("%d\n", n);
}
int main(void)
{
    char str[] = "Hello";
    Func(str);
}

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

输出结果为: 4 5

strlen只是对传递给Func 函数的那个字符串求长度,跟str_arg中的那个2 是没有任何关系的, 即使把2 改为200 也是不影响输出结果的

编辑于 2015-01-06 22:43:38 回复(13)
流头像
4
5
发表于 2014-12-11 16:48:55 回复(0)
1,对于voidFunc(charstr_arg[2]) 这一句不要被那个2误导了
下面这些写法都可以的。
voidFunc(charstr_arg[])
voidFunc(charstr_arg[1])
voidFunc(charstr_arg[2])
voidFunc(charstr_arg[3])
voidFunc(charstr_arg[4])
...
voidFunc(charstr_arg[200])
...

也可以写成
voidFunc(char *str_arg)

之所以能这样写,是因为Func的参数是一个地址

2,对于sizeof的参数,是一个指针,因为这是32位系统, 32 = 8*4,需要4字节存储指针。
如果是64位系统  64 = 8*8,需要8字节

3,对于strlen,就是字符串的长度,"Hello"长度是5


发表于 2015-09-10 19:51:01 回复(3)
sizeof 是可用来计算字符串的总长度,包括\0,而strlen计算不包含\0的字符串的长度。
当数组作为函数的参数时,其自动转换为指向函数的指针,sizeof(str_arg)表示的是指针的长度,在32为计算机上为4位。
发表于 2015-09-07 21:15:17 回复(5)
数组名作为形参时会退化为指针,sizeof(指针)在32位机上的结果为4。strlen则会计算字符串的长度,结果为5。
发表于 2017-06-23 13:04:35 回复(0)
首先数组名作为实参传递,退化为指针,传递的是地址,而接收的形参虽然写成数组形式,但同样也看成指针,所以里面的2没有任何意义。
然后sizeof一个指针,在32位系统里面永远都是4个字节。strlen则求的是实际字符串的长度,不包括最后的'\0'。
发表于 2019-05-31 15:09:22 回复(0)
对数组求长度,str_arg 后面的那个2没有任何意义,数组已经退化为指针了
发表于 2015-01-06 22:43:21 回复(1)
其实严格来说,四个选项都不正确,有输出格式的:
4
5

发表于 2015-02-10 23:51:10 回复(0)
64为 linux下 输出
8
5
vs2013下输出
4
5
strlen函数 通过指针移位,遇'\0'停止 进行判断。所以得到的是字符串的长度,这里是5,没错。

发表于 2014-12-04 11:08:11 回复(1)
sizeof(32位指针) = 4
strlen函数,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域,此处是那个32位指针所指地址)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含“\0”)。
发表于 2015-09-02 17:17:22 回复(0)
1、数组作为函数的参数,转化为指针,32位  sizeof的结果为4
2、strlen,计算长度,不含/0  结果为5
发表于 2015-09-01 16:47:30 回复(0)
数组名作为实参传递,传递的是地址,sizeof退化为指针
发表于 2021-11-30 15:22:16 回复(0)
str_arg是数组名,sizeof(str_arg)是算的指针的长度
发表于 2021-04-15 10:34:09 回复(0)
sizeof()用来计算一个对象或者类型所占的内存字节数,这里的 str[] 是char 类型的,一个 char 类型是一个字节,也就是8位,这里是32位计算机,所有一共占了32/8=4 个字节,所以sizeof() 等于4
strlen() 用来计算字符串的长度,这里的"hello"有5个字母,所以长度为5
发表于 2020-09-09 21:05:05 回复(0)
数组作为形参传递,退化为指针 所以m=4 n=5
发表于 2020-03-14 14:27:13 回复(0)
strlen是从字符串首地址出发一直往后直到遇到一个'\0'终止符
而数组作为参数传递时会退化成指针,所以sizeof相当于对一个char指针求size,一个char占一个字,32位机器就是4byte
编辑于 2020-01-10 20:45:26 回复(0)
函数名作为形参自动退化为指针,32位系统下,指针大小是4个字节。
void Evaiuate(int iArrayName[10])相当于
void Evaiuate(int* iArrayName)

下标没有意义,在函数体中不能使用,也就是说void Evaiuate(int iArrayName[10])写成void Evaiuate(int iArrayName[ ])都可以。
对于strlen,就是字符串的长度。
发表于 2017-07-28 09:53:53 回复(0)
数组名只有在作为形参的时候才会蜕化为指针,sizeof的作用就是求的指针的大小,是指类型。
strlen是求字符串的长度
发表于 2017-07-18 15:00:29 回复(0)
6,5
发表于 2014-12-04 15:09:27 回复(0)
8
5
发表于 2014-11-26 16:30:32 回复(0)
sizeof的作用就是求的指针的大小 32位机器字节数为4 所以是4 strlen是求字符串的长度 5个字符
发表于 2023-03-31 10:25:22 回复(0)