今日刷题之sizeof的应用环境

目录

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

1)标准答案

2)修改后的代码

3)我的理解


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

sizeof是获取了数据在内存中所占用的存储空间,以字节为单位来计数。此题中sizeof(str) / sizeof(str[0]);     sizeof(arr)--->是整个数组所占字节数,sizeof(str[0])--->是数组中一个元素所占字节数,二者相除就是数组的大小。

void UpperCase(char *str) // 将 str 中的小写字母转换成大写字母
{
	for (int i = 0; i< sizeof(str) / sizeof(str[0]);i++)
	{
		if ('a' <= str[i] && str[i] <= 'z')
			str[i] -= ('a' - 'A');//'a'ascll码值97   'A'ascll值65    
	}
}
int main()
{
     char str[] = "aBcDe";
     cout << "str字符长度为: " << sizeof(str) / sizeof(str[0]) << endl;
     UpperCase(str);
     cout << str << endl;
}

vs2019报的警告,虽然不影响运行结果,但还是需要处理

1)标准答案

答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。

2)修改后的代码

void UpperCase(char *str,int len) // 将 str 中的小写字母转换成大写字母
{
	for (int i = 0; i<len;i++)
	{
		if ('a' <= str[i] && str[i] <= 'z')
			str[i] -= ('a' - 'A');//'a'ascll码值97   'A'ascll值65    
	}
}
int main()
{
     char str[] = "aBcDe";
	 int len = sizeof(str) / sizeof(str[0]);
     cout << "str字符长度为: " << sizeof(str) / sizeof(str[0]) << endl;
     UpperCase(str,len);
     cout << str << endl;
}

截图:

3)我的理解

开始先看了函数主体,没有什么问题后,注意到这个函数没有传入数组的长度,平时在写函数的时候就顺理成章传进去长度了,现在已经想不起来为什么要传长度了。

说正题,因为我们 往某个函数里面传数组的时候,其实我们传的是数组的首地址,那么这时候用sizeof求数组长度的话,求出的长度就是指针的大小,所以容易造成数组越界。

猜你喜欢

转载自blog.csdn.net/weixin_62456756/article/details/128209939