首页 > 试题广场 >

以下代码中的两个sizeof用法有问题吗?

[单选题]
以下代码中的两个sizeof用法有问题吗?
void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母
{
    for ( size_t i = 0; i < sizeof(str) / sizeof(str[0]); ++i )
        if ( 'a' <= str[i] && str[i] <= 'z' )
            str -= ('a' - 'A' );
}

char str[] = "aBcDe";
cout < < "str字符长度为: " < < sizeof(str) / sizeof(str[0]) < < endl;
UpperCase( str );
cout < < str < < endl;

  • 函数内的有问题
  • 函数外的有问题
  • 函数内,外的都有问题
  • 用法正确
推荐
外层是字符串长度不正确,内层是数组退化为指针。
编辑于 2018-05-07 16:43:44 回复(12)
内外的都有问题
发表于 2015-06-23 19:42:42 回复(0)
函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,因为还有'\0',函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。
编辑于 2016-07-04 17:33:40 回复(4)
其实这个题想问的不是语法的问题,语法都没问题,而是函数实现问题,函数外是求字符串长度,但数组做函数长度会退化为指针,sizeof(str)=4,用strlen格式,外面的是因为多了字符串结尾'\0'
发表于 2017-01-05 22:39:17 回复(2)
如果按strlen来说长度的话
外面的肯定也是错的
发表于 2015-09-05 09:42:09 回复(2)
函数内:
数组名作为函数参数传递给函数时,会退化为指针。
void UpperCase( char str[]) 等价于 void UpperCase( char *str)
所以sizeof(str)得到的是指针的大小

函数外:
应该使用strlen,而不是sizeof,因为字符串末尾有\0

发表于 2021-08-05 21:43:48 回复(1)
1.sizeof是算符,strlen是函数。 搜索 2.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
3.数组做sizeof的参数不退化,传递给strlen就退化为指针了。 
4.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是
sizeof(x)可以用来定义数组维数的原因 
5.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。 
6.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, 
sizeof 返回全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 ;(故上面函数内是错误的)
举例说明:
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 获得的是一个指针的之所占的空间,应该是整型的,32位系统是4;64位系统是8;
#include<iostream>
#include<cstring>
using namespace std;
 
int main()
{
    char str[] ="aBcDe";
    char *str1 ="aBcDe";
    cout << "str[]字符长度为: "<<sizeof(str)<<endl;//结果为6 
	cout<<"*str1字符长度为: "<<sizeof(str1)<<endl; //结果为8  系统64位 
    cout << "str字符长度为: " << sizeof(str) / sizeof(str[0]) << endl;//结果为6 
    cout << "str字符长度为: " << strlen(str)<< endl;//结果为5 
    return 0; 
} 
综上 我觉得 函数外也是有点问题的 str字符长度是5,str所占的内存空间是6,因为字符数组后加一个‘\0’.这是个人观点。

编辑于 2016-11-09 09:40:42 回复(1)
两个都错,按照题目的意思,代码应改成:
函数内:for ( size_t i = 0; i < strlen(str); ++i )
函数外: cout < < "str字符长度为: " < < sizeof(str) / sizeof(str[0]) -1< < endl;
发表于 2017-01-16 08:24:46 回复(0)
char str[] = "aBcDe";
cout < < "str字符长度为: " < < sizeof(str) / sizeof(str[0]) < < endl;
输出为6,sizeof(str)包括‘\0’
发表于 2015-07-02 10:03:12 回复(0)
数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。函数内部,str传递到函数后就完全退化为一个指针,该指针指向的是数组str[]所在的地址,还有str -= ('a' - 'A' ); 这里也有问题,应该是str[i]-=('a' - 'A' ); 外部应该把sizeof换成strlen
发表于 2018-04-10 11:30:11 回复(0)
形参数的数组被当作指针来处理,所以用sizeof处理是不恰当的。
sizeof只能用来处理静态数组的大小。
发表于 2016-05-22 15:28:30 回复(0)
数组作为形参传递,退化为指针
函数外没有问题,选A
发表于 2015-06-05 16:02:12 回复(0)
外部错是因为字符数组要预留以为'\0'结尾,所以是5个字母+1=6
内部错是因为字符串变成了指针变量,而指针变量的大小在32位系统上是4个字节,在64位系统上是8个字节。
好像是这样,有错可以指正,一切为了学习
发表于 2022-03-23 10:41:14 回复(0)

1,函数外换为strlen(),sizeof()为物理存储大小,strlen()为除去\0后逻辑字符串长度。

2,函数内使用错误。函数外数组在函数内部表示指针。

编辑于 2018-10-28 00:51:31 回复(0)
外层字符长度不对,每层退化为指针
发表于 2017-10-01 11:29:37 回复(0)
外面的sizeof为什么错了?
发表于 2016-08-11 14:10:24 回复(1)
函数参数为数组名,编译器看做是指针,因此sizeof(str)=4
发表于 2016-07-14 16:11:11 回复(0)
作为函数参数的数组名在函数内部退化为指针
发表于 2015-06-09 17:55:50 回复(0)

在函数内部,数组名传递给函数时会退化为指针类型,因此sizeof(str)返回的是指向字符数组的指针大小。

而在函数外部,我们应该使用strlen函数来获取字符串的长度,因为字符串末尾有一个空字符\0,而sizeof只能获取数组或指针的大小,无法正确计算字符串的长度。

因此,对于这个问题,我们应该使用以下代码:

cppCopy Code
void UpperCase(char str[]) { for (size_t i = 0; i < strlen(str); ++i) { if ('a' <= str[i] && str[i] <= 'z') { str[i] -= ('a' - 'A'); } } } // 在主函数中 char str[] = "aBcDe"; cout << "str字符长度为: " << strlen(str) << endl; UpperCase(str); cout << str << endl;
编辑于 2023-11-10 14:38:35 回复(0)
sizeof(str) / sizeof(str[0]
函数外的sizeof(str) / sizeof(str[0]的问题在于:求出的是字符数组的元素个数,也就是包含了'\0'在内一共6个元素,而长度是5,需要再减1才行。
函数内的sizeof(str) / sizeof(str[0]的问题在于:形参中的str是一个指针变量,sizeof(str)求出的是指针变量的大小。
发表于 2023-05-01 23:08:36 回复(0)
外面求字符串长度应该用strlen,用sizeof多算一个\0,内部感觉没错呀,emm喝外面一样不需要高\0,我打印理解成普通数组了。。。。。。。。
发表于 2021-09-30 09:46:23 回复(1)