c语言中空指针的比较
这是一段教程中的代码,用户在其中输入字符串的大小和字符串本身。代码应该使用内存分配来重现相同的字符串。我对代码没有什么疑问-c语言中空指针的比较,c,pointers,C,Pointers,这是一段教程中的代码,用户在其中输入字符串的大小和字符串本身。代码应该使用内存分配来重现相同的字符串。我对代码没有什么疑问- 为什么*文本指针在开始时初始化为NULL?这个初始化在程序的后面部分有用吗?或者初始化为NULL是一个很好的做法 为什么要将指针与NULL进行比较。一旦我们给指针分配了一个字符串,地址不会改变吗?字符串末尾的指针是否指向NULL(无地址) scanf(“”)有什么用 释放*text指针后,它再次被分配为NULL。那么它有效地释放了内存吗 #包括 #包括 int main(
*文本指针在开始时初始化为NULL?这个初始化在程序的后面部分有用吗?或者初始化为NULL是一个很好的做法
scanf(“”
)有什么用*text
指针后,它再次被分配为NULL。那么它有效地释放了内存吗李>
#包括
#包括
int main()
{
整数大小;
char*text=NULL;//---------------------------------------------->1
printf(“输入文本的限制:\n”);
scanf(“%d”,大小(&S);
text=(char*)malloc(size*sizeof(char));
如果(text!=NULL)/------------------------------------------------------------->2
{
printf(“输入一些文本:\n”);
scanf(“”;//---------------------------------------------->3
获取(文本);
printf(“输入的文本为:%s\n”,文本);
}
免费(文本);
text=NULL;//------------------------------------------------------------->4
返回0;
}
每当我们声明变量时,最好使用一些值初始化它。在这里声明动态数组时,使用NULL
对其进行初始化
它被设置为NULL,以便检查文本是否有效。如果malloc以某种方式失败,文本仍然是NULL
。因此,您可以检查malloc是否无法分配内存。尝试为大小输入一个无效的数字,如-1
。您将看到程序不会提示输入文本,因为malloc失败,文本仍然是NULL
。我认为这可以回答您的问题1、2和4,即为什么文本被设置为NULL以及为什么它要检查文本是否为NULL
对于第三个查询,在使用scanf(“%d”,&size)获得大小输入后代码>,您正在按Enter
。如果不使用scanf(“”
,则按下的Enter
将作为gets(文本)的结尾,文本将始终为空。因此,要忽略在scanf(“%d”,&size)之后按下的Enter
代码>,scanf(“”)正在使用。在此函数中:
完全不需要,因为在未初始化此函数时,不会有使用自动变量的危险
此测试检查malloc
是否成功。如果malloc
失败,则返回NULL
有点奇怪的跳过空格的方法
这句话根本不需要。函数终止,变量停止存在
结论:我不建议您在学习编程时使用这种代码作为示例。作者的C知识非常有限
为什么*文本指针在开始时初始化为NULL
主要是为了保护你不受自己人性的伤害。随着代码的发展,通常很容易忘记在一个或多个代码分支中初始化指针,然后取消对未初始化指针的引用-这是未定义的行为,因此不保证崩溃。在最坏的情况下,如果您没有使用Valgrind等适当的工具(它会马上指出),您可能会花费数小时或数天的时间来发现这样的问题,因为它是多么不可预测,而且因为行为会根据调用前堆栈上的其他内容而发生变化,所以您可能会看到“bug”在一个完全不可复制且完全没有错误的代码中
为什么要将指针与NULL进行比较
因为malloc
可以返回空值,而且它返回空值并不意味着您可以取消引用它。空指针值很特殊:它意味着“嘿,这个指针无效,不要用它做任何事情”。因此,在取消引用从malloc
返回的任何内容之前,必须检查它是否为null。否则,这是一种未定义的行为,现代编译器可能会在出现这种行为时对您的代码执行非常意外的操作。但在问这样的问题之前,我建议你经常检查一下你想知道的功能实际上是设计用来做什么的。谷歌cppref malloc
,第一个点击是:。在返回值标题下,我们读到:
失败时,返回空指针
这就是为什么它将指针与NULL进行比较
scanf(“”)有什么用
这个很简单:你可以自己查一下。C标准库有很好的文档记录:
阅读时,相关部分是:
- 格式:指向以null结尾的字符串的指针,指定如何读取输入。
格式字符串由[…]组成
空白字符:格式字符串中的任何单个空白字符都会使用输入中所有可用的连续空白字符(就像在循环中调用isspace一样确定)。请注意,格式字符串中的“\n”、“”、“t\t”或其他空格之间没有区别
这就是您的答案:scanf(“”
将使用输入中的任何空白字符,直到它达到EOF或第一个非空白字符
释放*文本指针后,它再次被分配为NULL。那么它有效地释放了内存吗
不。首先,这里使用的语言是错误的:指针被赋值为NULL。什么都没有分配!指针就像一个邮政地址。您可以将其替换为单词“NOWHERE”,这就是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;
}
#include <stdio.h>
#include <stdlib.h>
void process_text(int size)
{
char *const text = malloc(size * sizeof(char));
if (!text) return;
printf("Enter some text: \n");
scanf(" ");
gets(text);
printf("Inputted text is: %s\n", text);
free(text);
}
int main()
{
int size;
printf("Enter limit of the text: \n");
scanf("%d", &size);
process_text(size);
}
void process_text_alternative_version(int size)
{
char *text = malloc(size * sizeof(char));
if (text) {
printf("Enter some text: \n");
scanf(" ");
gets(text);
printf("Inputted text is: %s\n", text);
}
free(text);
}
void process_text_alternative_version_not_recommended(int size)
{
char *text = malloc(size * sizeof(char));
if (text) {
printf("Enter some text: \n");
scanf(" ");
gets(text);
printf("Inputted text is: %s\n", text);
free(text);
}
}