鱼C论坛

 找回密码
 立即注册
查看: 1256|回复: 3

[已解决]想问一下C语言在定义指针时,有必要将其初始化为NULL吗

[复制链接]
发表于 2021-9-20 10:22:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
就比如在主函数中定义的指针La,Lb,Lc,如果初始化为空指针有什么风险
  1. //归并有序线性表之链式存储
  2. #include <stdio.h>
  3. #include<stdlib.h>

  4. typedef struct Node *List;
  5. typedef struct Node {
  6.     int data;
  7.     List next;
  8. } node;

  9. void CreateList_n(List &head, int n)//创建链表,采用尾插入法,首个结点不存储数据
  10. {
  11.     int i = 0;
  12.     head = (List) malloc(sizeof(node));
  13.     head->next = NULL;
  14.     List tail = head;//始终指向尾结点
  15.     printf("请由小到大输入链表表的数据:\n");
  16.     while (i < n) {
  17.         List s = (List) malloc(sizeof(node));//申请新节点的内存
  18.         scanf("%d", &s->data);
  19.         tail->next = s;
  20.         tail = s;
  21.         i++;
  22.     }
  23.     tail->next = NULL;
  24. }

  25. void PrintList(List head)//输出链表的数据
  26. {
  27.     List p = head->next;
  28.     while (p) {
  29.         printf("\t%d", p->data);
  30.         p = p->next;
  31.     }
  32.     putchar('\n');
  33. }

  34. void Merge(List &La, List &Lb, List &Lc) {
  35.     List pa = La->next;
  36.     List pb = Lb->next;
  37.     List pc = La;
  38.     Lc = La;
  39.     while (pa && pb)//两者都不为空指针时
  40.     {
  41.         if (pa->data <= pb->data)//把pa所指的结点插入到链表Lc中,采用尾插法
  42.         {
  43.             pc->next = pa;
  44.             pc = pa;//pc始终指向链表Lc的尾结点
  45.             pa = pa->next;

  46.         } else {
  47.             pc->next = pb;
  48.             pc = pb;
  49.             pb = pb->next;
  50.         }
  51.     }
  52.     //如果走出循环了,有可能是一个链表遍历完了,另一个还没有遍历完.
  53.     pc->next = pa ? pa : pb;//把剩余没有遍历完的数据段插入到Lc后面
  54.     free(Lb);
  55. }

  56. int main() {
  57.     int n;
  58.     printf("请输入链表A的数据规模:\n");
  59.     scanf("%d", &n);
  60.     List La = NULL, Lb = NULL, Lc = NULL;
  61.     CreateList_n(La, n);
  62.     printf("所建的链表A为:\n");
  63.     PrintList(La);
  64.     printf("请输入链表B的数据规模:\n");
  65.     scanf("%d", &n);
  66.     CreateList_n(Lb, n);
  67.     printf("所建的链表A为:\n");
  68.     PrintList(Lb);
  69.     Merge(La, Lb, Lc);
  70.     printf("归并后的链表为:\n");
  71.     PrintList(Lc);
  72.     return 0;
  73. }

复制代码
最佳答案
2021-9-20 10:33:13
一般来说不需要,你只要在使用之前初始化就可以了
这里说的初始化可不一定就是初始化成 NULL 一般是初始化成一个对象的指针,就是已经可以使用的地址
一个变量的地址或者 malloc 返回的地址
char *str;
// ....
// ....
// ....
str = get_string();

这样定义的时候不初始化成 NULL,在某个位置直接赋值成一个已经可以使用的地址
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-9-20 10:29:05 | 显示全部楼层
想问一下C语言在定义指针时,有必要将其初始化为NULL吗
这问题不能一概而论,要根据代码的上下文来确定的
一般来说不需要,你只要在使用之前初始化就可以了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-20 10:33:13 | 显示全部楼层    本楼为最佳答案   
一般来说不需要,你只要在使用之前初始化就可以了
这里说的初始化可不一定就是初始化成 NULL 一般是初始化成一个对象的指针,就是已经可以使用的地址
一个变量的地址或者 malloc 返回的地址
char *str;
// ....
// ....
// ....
str = get_string();

这样定义的时候不初始化成 NULL,在某个位置直接赋值成一个已经可以使用的地址
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-20 10:42:25 | 显示全部楼层
人造人 发表于 2021-9-20 10:33
一般来说不需要,你只要在使用之前初始化就可以了
这里说的初始化可不一定就是初始化成 NULL 一般是初始化 ...

行,多谢了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 10:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表