donjames 发表于 2021-9-20 10:22:52

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

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

typedef struct Node *List;
typedef struct Node {
    int data;
    List next;
} node;

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

void PrintList(List head)//输出链表的数据
{
    List p = head->next;
    while (p) {
      printf("\t%d", p->data);
      p = p->next;
    }
    putchar('\n');
}

void Merge(List &La, List &Lb, List &Lc) {
    List pa = La->next;
    List pb = Lb->next;
    List pc = La;
    Lc = La;
    while (pa && pb)//两者都不为空指针时
    {
      if (pa->data <= pb->data)//把pa所指的结点插入到链表Lc中,采用尾插法
      {
            pc->next = pa;
            pc = pa;//pc始终指向链表Lc的尾结点
            pa = pa->next;

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

int main() {
    int n;
    printf("请输入链表A的数据规模:\n");
    scanf("%d", &n);
    List La = NULL, Lb = NULL, Lc = NULL;
    CreateList_n(La, n);
    printf("所建的链表A为:\n");
    PrintList(La);
    printf("请输入链表B的数据规模:\n");
    scanf("%d", &n);
    CreateList_n(Lb, n);
    printf("所建的链表A为:\n");
    PrintList(Lb);
    Merge(La, Lb, Lc);
    printf("归并后的链表为:\n");
    PrintList(Lc);
    return 0;
}

人造人 发表于 2021-9-20 10:29:05

想问一下C语言在定义指针时,有必要将其初始化为NULL吗
这问题不能一概而论,要根据代码的上下文来确定的
一般来说不需要,你只要在使用之前初始化就可以了

人造人 发表于 2021-9-20 10:33:13

一般来说不需要,你只要在使用之前初始化就可以了
这里说的初始化可不一定就是初始化成 NULL 一般是初始化成一个对象的指针,就是已经可以使用的地址
一个变量的地址或者 malloc 返回的地址
char *str;
// ....
// ....
// ....
str = get_string();

这样定义的时候不初始化成 NULL,在某个位置直接赋值成一个已经可以使用的地址

donjames 发表于 2021-9-20 10:42:25

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

行,多谢了
页: [1]
查看完整版本: 想问一下C语言在定义指针时,有必要将其初始化为NULL吗