c - 为什么未初始化的指针变量作为字符串会导致错误?
问题描述
#include <stdio.h>
int main()
{
char *p;
p[0]='a';
p[1]='b';
p[2]='c';
p[3]='d';
p[4]='\0';
}
上面的程序与下面的程序有什么不同?
#include <stdio.h>
int main()
{
char *p = "abcd";
}
解决方案
在 C 语言中,指针本身和所指向的内容之间存在区别,并且您上面显示的代码示例遇到了这种差异。
让我们从第二个代码示例开始:
char* p = "abcd";
在这里,它执行以下操作。首先,它在内存中放置一个包含字符串的五个字符的数组"abcd"
。看起来像这样:
+---+---+---+---+---+
| a | b | c | d | \0|
+---+---+---+---+---+
接下来,它创建指针p
,并告诉p
指向该数组中的第一个字符:
+-----+
| | p
+-----+
|
v
+---+---+---+---+---+
| a | b | c | d | \0|
+---+---+---+---+---+
在这一点上,宇宙中一切都很好。
现在,将其与您编写的另一段代码进行对比。第一行,char* p
创建一个指针p
,但没有告诉它指向哪里。结果,它随机指向某个地方,并且可能指向您不拥有的内存:
+-----+
p | | -----> ???
+-----+
现在,如果你写p[0] = a
,你是在说“请去p
指点的地方写一个a
”。不幸的是,p
它没有指向你拥有的任何东西,所以这相当于说“我知道我实际上并没有将这支枪瞄准任何明智的方向,但让我们扣动扳机看看会发生什么。” 你很容易伤害别人,可能是你自己!
要解决此问题,您需要创建指针p
并告诉它您希望它指向的位置。您可以使用malloc
为自己获取一块内存,或者strdup
获取要指向的字符串的副本,或者如果您愿意,可以使用字符串文字。
展望未来,绘制这样的图片对于理解代码在做什么非常有帮助。
推荐阅读
- ajax - Laravel:“CSRF 令牌不匹配。”,在正确的代码上
- python - 对象的模棱两可的 Python 引用计数作为类构造函数的参数
- html - 具有相同十六进制代码的颜色不会显示相同的颜色 css
- firebase - Flutter:如何在创建具有特定字段值的文档时向用户发送通知。(如何订阅有条件的主题)
- ios - 使用来自 Xcode 的 GitHub 的问题
- postgresql - TimescaleDB上的速度查询非常慢
- javascript - React 嵌套路由用子组件渲染父组件
- excel - 收缩每边选择 1 的单元格
- javascript - Vscode 扩展:如何实现悬停功能以向命令添加参数,例如,使用查询运行搜索命令
- javascript - TypeError:无法读取 React Map 中未定义的属性“地图”