首页 > 后端开发 > C++ > 正文

为什么 C 中指针和基于数组的字符串初始化时'strlen”和'sizeof”返回不同的值?

Susan Sarandon
发布: 2024-11-01 07:14:02
原创
616 人浏览过

Why do `strlen` and `sizeof` return different values for pointer and array-based string initialization in C?

对于基于指针和数组的 String init 的 strlen 和 sizeof 的不同答案[重复]

在 C 编程语言中,当声明一个数组和指向字符串的指针,可以使用“strlen”和“sizeof”函数获得不同的输出。理解这种差异对于有效的内存管理和数据处理至关重要。

为了说明这种差异,请考虑以下代码片段:

char *str1 = "Sanjeev";
char str2[] = "Sanjeev";
printf("%d %d\n",strlen(str1),sizeof(str1));    
printf("%d %d\n",strlen(str2),sizeof(str2));
登录后复制

生成的输出将是:

7 4
7 8
登录后复制
登录后复制

“strlen”函数返回字符串中的字符数,不包括空终止符。在这两种情况下,字符串都包含 7 个字符。另一方面,“sizeof”函数返回内存中数据类型的大小。

对于指针“str1”,“sizeof(str1)”返回指针变量本身的大小,在大多数系统上通常为 4 个字节。这是因为“str1”不是一个数组,而只是一个指向字符串“Sanjeev”的指针。

相比之下,“str2”是一个字符数组。 'sizeof(str2)' 返回整个数组的大小,包括空终止符。结果,它输出 8 个字节:7 个字节用于字符,1 个字节用于空终止符。

要进一步理解这个概念,请考虑以下修改后的代码:

char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;
printf("%d %d\n",strlen(str1),sizeof(str1));    
printf("%d %d\n",strlen(str2),sizeof(str2));
登录后复制

这此时,输出将是:

7 4
7 8
登录后复制
登录后复制

即使 'str1' 和 'str2' 引用相同的字符串,'sizeof' 输出仍然相同。这是因为“str1”仍然是一个指针,而“str2”仍然是一个数组。两者的“strlen”输出都保持为 7,因为它只计算字符串中的字符。

以上是为什么 C 中指针和基于数组的字符串初始化时'strlen”和'sizeof”返回不同的值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!