c - 关于 char *s 和 char s[] 如何在低级别工作的困惑
问题描述
我知道类似的问题,例如这个问题,已在此处发布和回答,但这些答案并没有为我提供完整的图片,因此我将其作为一个新问题发布。希望没关系。
请参阅以下片段 -
char s[9] = "foobar"; //ok
s[1] = 'z' //also ok
和
char s[9];
s = "foobar" //doesn't work. Why?
但请参阅以下案例 -
char *s = "foobar"; //works
s[1] = 'z'; //doesn't work
char *s;
s = "foobar"; //unlike arrays, works here
这有点令人困惑。我的意思是我有模糊的理解,我们不能为数组赋值。但是我们可以修改它。在 的情况下char *s
,我们似乎可以赋值但不能修改它,因为它是写在只读存储器中的。但我仍然无法获得全貌。
低水平到底发生了什么?
解决方案
char s[9] = "foobar";
这是初始化。声明了一个大小为 9 的字符数组,然后其内容接收字符串"foobar"
,并将任何剩余字符设置为'\0'
。
s = "foobar"
只是无效的 C 语法。您不能将字符串分配给 char 数组。使s
有价值foobar
。利用strcpy(s,"foobar");
char *s = "foobar";
也是初始化,但是,这会将常量字符串的地址foobar
分配给指针变量 s
。请注意,我说的是“常量字符串”。字符串文字在大多数平台上都是常量。一个更好的方法是写const char *s = "foobar";
事实上,你的下一个任务s[1]= 'z';
不会起作用,因为s
它是不变的。
推荐阅读
- git - 如何覆盖 git log --format=oneline 实际格式?
- codeblocks - Code::Blocks 控制台打开;实际上并不运行代码
- python - 在 ffmpeg 中获取 rms 级别的减少数据
- ms-access - 如何制作 Ms-Access 插件?
- c# - 从 c# 转换为 vb 时出现函数错误
- c# - C#:Unity 容器和 ILogger
- cordova - SAPUI5 混合应用程序 - 如何实现注销功能?
- javascript - 使用变量遍历 JSON
- linq - EF6 选择多对多关系
- c# - 自定义客户端不显眼的适配器验证方法调用 Ajax