2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > C语言中指针和内存究竟什么关系?已经free释放的内存还能用吗?

C语言中指针和内存究竟什么关系?已经free释放的内存还能用吗?

时间:2018-09-10 19:06:03

相关推荐

C语言中指针和内存究竟什么关系?已经free释放的内存还能用吗?

指针是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 指向设定的内存,为什么还是能够得到预期的结果呢?

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。