指针是C语言的灵魂,因此随意挑选一个C语言程序项目,一般都能够看到指针的大量应用。指针允许程序员访问内存,但是初学者往往会误以为“指针就是内存”,写出错误的C语言代码,为此,本节将以问答的方式讨论C语言中指针与内存的关系。
下面这段C语言代码为什么不能正常工作?
小明写了一段C语言程序,允许用户输入一段字符串,并将其打印到控制台,核心代码段如下:
char *answer;printf("Type something:\n");gets(answer);printf("You typed \"%s\"\n", answer);
小明定义了一个 char 型指针,用于接收用户输入的字符串,但是编译执行这段C语言代码时,它发现程序并不能按照他的预期进行,这是为什么呢?
这是因为指针 answer 尚未指向系统分配给该程序使用的内存。事实上,上述C语言代码中的 answer 没有被初始化,它就有可能指向任意地址,而它指向的内存并不是提供给这段程序使用的。所以,小明的C语言程序表现就未知了,可能根本无法编译通过,可能表现正常,也有可能运行时崩溃。
小明的C语言程序表现未知
归根结底,就是 answer 指针没有指向一块属于自己的内存。若希望小明的C语言程序正常,可以将 answer 改为数组,例如:
#include <stdio.h>#include <string.h>char answer[100], *p;printf("Type something:\n");fgets(answer, sizeof(answer), stdin);if((p = strchr(answer, "\n")) != NULL) *p = "\0";printf("You typed \"%s\"\n", answer)
正确的C语言代码
修改后的C语言代码还将 gets() 改为 fgets(),以确保用户的输入不会溢出数组 answer。
既如此,下面这段C语言代码为什么又可以正常工作了呢?
可能有读者曾经写过下面这样的C语言代码,按照上面的分析,代码并没有让 p 指向设定的内存,为什么还是能够得到预期的结果呢?