这是教程中的代码,用户在其中输入字符串的大小和字符串本身。该代码应使用内存分配来重现相同的字符串。我对代码几乎没有疑问-
*text
指针在开始时初始化为NULL?此初始化在程序的后面部分有用吗,还是将其初始化为NULL是一个好习惯。scanf(" ")
的用途是什么?*text
指针后,再次将其分配为NULL。那么它有效地释放了内存吗? #include <stdio.h>
#include <stdlib.h>
int main()
{
int size;
char *text = NULL; //---------------------------------------------------------->1
printf("Enter limit of the text: \n");
scanf("%d", &size);
text = (char *) malloc(size * sizeof(char));
if (text != NULL) //---------------------------------------------------------->2
{
printf("Enter some text: \n");
scanf(" "); //---------------------------------------------------------->3
gets(text);
printf("Inputted text is: %s\n", text);
}
free(text);
text = NULL;//---------------------------------------------------------->4
return 0;
}
在此功能:
完全不需要,因为没有使用未在此函数中初始化的自动变量的危险
此测试检查malloc
是否成功。如果malloc
失败,则返回NULL
一种跳过空格的怪异方法
完全不需要此语句。函数终止,变量停止存在。
结论:当您学习编程时,我不建议将这种代码用作示例。作者的C知识是IMO非常有限的
[每当我们声明一个变量时,最好使用一些值对其进行初始化。当您在此处声明动态数组时,您正在使用NULL
对其进行初始化。
它设置为NULL,因此有助于检查文本是否有效。如果某种原因malloc失败,则文本仍为NULL
。因此,您可以检查malloc是否分配内存失败。尝试为-1
之类的尺寸输入无效数字。您会看到程序不会提示输入文本,因为malloc失败并且文本仍为NULL
。我认为这可以回答您的查询1、2和4,有关为什么将文本设置为NULL以及为什么要检查文本是否为NULL。
对于第三查询,使用scanf("%d", &size);
获得尺寸输入后,按Enter
。如果不使用scanf(" ")
,则按下的Enter
将作为gets(text)的结尾,并且文本始终为空。因此,为了忽略在Enter
之后按下的scanf("%d", &size);
,正在使用scanf(" ")
。