首页 > 试题广场 >

在linux下64位c程序,请计算输出的三个sizeof分别

[单选题]
在linux下64位c程序,请计算输出的三个sizeof分别是()
void func(char str_arg[100]){
     cout << sizeof(str_arg) << endl;
}
int main(int argc,char* argv[]){
     char str[] = "Hello";
     char *p = str;
     cout << sizeof(str) << endl;
     cout << sizeof(p) << endl;
     func("test");
     return 0;
}
  • 5,5,8
  • 6,6,4
  • 6,8,4
  • 6,8,8
推荐
sizeof对数组求长度为数组的真实长度,字符串数组的长度要加上最后的'\0'字符。
64位机器的指针占8个字节。
编辑于 2015-01-27 16:10:06 回复(6)
D
最后一个:数组作为函数的参数传递时,char str_arg[100]实际为 char *str_arg,传递的是指向数组首元素的指针 sizeof(char *str_arg)=8(64位)
发表于 2015-04-03 12:10:14 回复(4)
补充一点:
数组形参int*等价于int []等价于int[10], 编译器会忽略任何为数组形参指定的长度
所以sizeof(str_arg)的结果是指针的长度。
发表于 2015-11-15 22:24:33 回复(0)
答案:D (已测试)
这里主要是区分sizeof运算符的测量对象
sizeof(str)测量的是字符数组的占用长度,注意字符串后还有个\0,所以是6
sizeof(p)测量的是指针的占用长度,64位系统下是8字节
sizeof(str_arg)测量的是指针长度,因为这里是形参。
发表于 2015-01-28 10:22:38 回复(5)
第一个输出的是数组长度,考虑加末尾的\0,所以为6。第二个输出的是指针长度,64位的地址占8字节,第三个输出的是首地址长度,所以也是8
发表于 2015-04-09 15:02:30 回复(4)
最后一个:函数的参数已经不是数组,而蜕变为了指针。在调用函数时,数组是用来传址的,调用者只需将实参的地址传递过去,所以参数已变为指针类型!
发表于 2017-05-31 16:14:41 回复(0)
分析最后一个,c++中不传数组引用给函数的话,数组参数会自动退化成指针
void getSize(const int (&a)[5])//使用引用防止数组退化
{     std::cout << sizeof(a) << std::endl;
}

void getSize2(const int a[5])//与int *a,int a[]同效
{     std::cout << sizeof(a) << std::endl;
}

//64位
//在visual studio 2017中
//int a[5];
//getSize(a);//20
//getSize2(a)//4
但是引用的话会定死数组的长度,上面代码中getSize()无法传入其他长度的int数组,过于僵硬
所以一般不会这样做,而一般的做法是多传入一个参数记录数组长度。
发表于 2018-07-25 23:02:48 回复(0)
最后一个:数组作为函数的参数传递时,char str_arg[100]实际为 char *str_arg,传递的是指向数组首元素的指针 sizeof(char *str_arg)=8(64位)

sizeof对数组求长度为数组的真实长度,字符串数组的长度要加上最后的'\0'字符。
发表于 2016-06-05 11:42:40 回复(0)
D
发表于 2015-01-12 16:29:58 回复(0)
要是有个答案是 6,8,100 我就选不对了
发表于 2023-08-28 17:16:46 回复(0)
我讲讲最后一个为什么是8:对于func函数来说,形参char srt_arg[100]等价于char *str_arg,因为调用func时可能会传递不同的字符串,不同的字符串,其首地址一般是不同的,那么str_arg肯定不是一个指针常量,它是可以被赋值的,因此str_arg实际上就是一个指针变量。所以sizeof(str_arg)算的就是指针变量的大小,不是数组的大小。
发表于 2022-10-29 17:04:31 回复(1)
gca头像 gca
D. 6 8 8
sizeof(str)计算的是字符数组的所占空间大小需要加末尾的\0 所以是6
sizeof(p)计算的是指针的长度,64位下,指针长度为64/8=8字节 所以是8
sizeof(str_arg)计算的也是指针长度 即8
发表于 2015-03-29 16:02:48 回复(0)
32位 指针4个字节 64位 指针8个字节
发表于 2018-11-06 12:40:49 回复(0)
注意指针的大小与其指向的类型无关
发表于 2017-08-02 23:04:40 回复(0)
D,
cout<<sizeof(str)<<endl;  //因为"Hello"是5个再加系统默认加的'\0'一共有6个字节。
cout<<sizeof(p)<<endl;  //p中这里是指针,而在64个系统中指针长度为8个字节。
func("test");  //还不清楚,但4个选项里没有5的选项,所以只能是8啦。


发表于 2015-02-12 14:41:03 回复(0)
数组作为形凡参传递时 会退化为指针
发表于 2024-05-21 14:54:00 回复(0)
数组传递时,形参只能传递地址,数组规模需要另外的参数显示
发表于 2023-08-07 10:00:47 回复(0)
2 3为求指针的大小,64位机器char的sizeof输出为8
发表于 2023-07-31 16:23:12 回复(0)
这题应该属于c++吧,怎么跑到c里来了,cout<<endl 这玩意我在c里没见过
发表于 2022-08-04 17:47:31 回复(0)
sizeof对数组求长度为数组的真实长度,字符串数组的长度要加上最后的'\0'字符。
64位机器的指针占8个字节。
发表于 2022-07-11 20:00:54 回复(0)
64位系统下 int的字节大小和32位一样,4Byte 指针则是8字节,32位下是4字节
发表于 2022-03-15 13:02:47 回复(0)