与c中NULL指针的比较

问题描述 投票:0回答:2

这是教程中的代码,用户在其中输入字符串的大小和字符串本身。该代码应使用内存分配来重现相同的字符串。我对代码几乎没有疑问-

  1. 为什么*text指针在开始时初始化为NULL?此初始化在程序的后面部分有用吗,还是将其初始化为NULL是一个好习惯。
  2. 为什么将指针与NULL进行比较。一旦为指针分配了字符串,地址是否会更改?字符串末尾的指针会指向NULL(无地址)吗?
  3. scanf(" ")的用途是什么?
  4. 释放*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;
}
c pointers
2个回答
0
投票

在此功能:

  1. 完全不需要,因为没有使用未在此函数中初始化的自动变量的危险

  2. 此测试检查malloc是否成功。如果malloc失败,则返回NULL

  3. 一种跳过空格的怪异方法

  4. 完全不需要此语句。函数终止,变量停止存在。

结论:当您学习编程时,我不建议将这种代码用作示例。作者的C知识是IMO非常有限的


-1
投票

[每当我们声明一个变量时,最好使用一些值对其进行初始化。当您在此处声明动态数组时,您正在使用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(" ")

© www.soinside.com 2019 - 2024. All rights reserved.