首页 > 解决方案 > 为什么未初始化的指针变量作为字符串会导致错误?

问题描述

#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";
}

标签: carraysstringpointerschar

解决方案


在 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获取要指向的字符串的副本,或者如果您愿意,可以使用字符串文字。

展望未来,绘制这样的图片对于理解代码在做什么非常有帮助。


推荐阅读