C 结构体指针初始化


原文 C 结构体指针初始化,CSDN同步发布。

转载请注明出处,谢谢!


在使用指针之前,务必要将其初始化。这是我们最早学习 C 语言的时候,书上经常说的一个问题。在工作中,我们反而会经常忘记这条金科玉律。

本篇文章的所有代码都经 gcc-7 编译器编译过。关于在 macOS 中如何安装和使用 gcc,可以参考 GCC: Homebrew 安装 GCC 和 Binutils 这篇文章。

强力推荐-不要错过,万一能帮助到自己呢?

朋友做了一个关于 人工智能的教程,教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!点 这里 可以跳转到教程,对人工智能感兴趣的同学可以了解一下。

结构体成员指针的初始化

结构体成员指针的初始化,指的是初始化结构体中指针变量的成员。

我们举个例子,下面是 Animal 的结构体。

struct Animal {
    char *name; //指针成员
    int age;
    char info[200]; //字符数组
    struct Animal *nextAnimal; //指针成员
};

结构体 Animal 含有4个成员变量,其中 nameinfonextAnimal 是指针变量。

写一段测试代码,如下:

int main(int argc, const char *argv[])
{
    struct Animal animal;
    
    printf("animal's name: %s, age: %i, info: %s\n", animal.name, animal.age, animal.info);
    
    return 0;
}

运行结果正常,终端输出如下:

animal's name: (null), age: 0, info: 

我们来验证一下 Animal *nextAnimal 在没有初始化的情况下,会不会有什么问题。

int main(int argc, const char *argv[])
{
    struct Animal animal;
    
    printf("animal's name: %s, age: %i, info: %s\n", animal.name, animal.age, animal.info);
    
    printf("animal.nextAnimal: %p\n", animal.nextAnimal);
    
    printf("animal.nextAnimal->name: %s, age: %i, info: %s\n", animal.nextAnimal->name, animal.nextAnimal->age, animal.nextAnimal->info);
    
    return 0;
}

程序编译没有问题,运行报错

animal's name: (null), age: 0, info: 
animal.nextAnimal: 0x1127fa036
Segmentation fault: 11

修改一下代码,初始化一下 animal.nextAnimal 这个指针,如下:

int main(int argc, const char *argv[])
{
    struct Animal animal;
    
    printf("animal's name: %s, age: %i, info: %s\n", animal.name, animal.age, animal.info);
    
    printf("animal.nextAnimal: %p\n", animal.nextAnimal);
    
    // 初始化指针变量
    animal.nextAnimal = (struct Animal *)malloc(sizeof(struct Animal));
    
    printf("animal.nextAnimal->name: %s, age: %i, info: %s\n", animal.nextAnimal->name, animal.nextAnimal->age, animal.nextAnimal->info);
    
    return 0;
}

再次编译重新运行,还是报错。还需要初始化 animal.nextAnimal->name 这个变量。

int main(int argc, const char *argv[])
{
    struct Animal animal;
    
    printf("animal's name: %s, age: %i, info: %s\n", animal.name, animal.age, animal.info);
    
    printf("animal.nextAnimal: %p\n", animal.nextAnimal);
    
    // 初始化指针变量
    animal.nextAnimal = (struct Animal *)malloc(sizeof(struct Animal));
    
    // 初始化 name 变量
    animal.nextAnimal->name = "cat";
    
    printf("animal.nextAnimal->name: %s, age: %i, info: %s\n", animal.nextAnimal->name, animal.nextAnimal->age, animal.nextAnimal->info);
    
    return 0;
}

编译运行,一切正常。

animal's name: (null), age: 0, info: 
animal.nextAnimal: 0x10f0f1036
animal.nextAnimal->name: cat, age: 0, info: 

通过上面的例子,结构体指针变量有些会给默认值,有些又不会给,所以都要初始化指针变量。
修改一下代码,示例如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Animal {
    char *name; //指针成员
    int age;
    char info[200]; //字符数组
    struct Animal *nextAnimal; //指针成员
};

int main(int argc, const char *argv[])
{
    struct Animal animal;
    
    animal.name = "cat";
    strcpy(animal.info, "This is a cat.");
    printf("animal's name: %s, age: %i, info: %s\n", animal.name, animal.age, animal.info);
    
    printf("animal.nextAnimal: %p\n", animal.nextAnimal);
    
    // 初始化指针变量
    animal.nextAnimal = (struct Animal *)malloc(sizeof(struct Animal));
    
    // 初始化变量
    animal.nextAnimal->name = "cat";
    strcpy(animal.nextAnimal->info, "This is a cat.");
    
    printf("animal.nextAnimal->name: %s, age: %i, info: %s\n", animal.nextAnimal->name, animal.nextAnimal->age, animal.nextAnimal->info);
    
    return 0;
}

结构体指针的初始化

指的是初始化结构体指针变量。

int main(int argc, const char *argv[])
{  
    struct Animal *ptAnimal;
        
    printf("ptAnimal's name: %s, age: %i, info: %s\n", ptAnimal->name, ptAnimal->age, ptAnimal->info);
    
    return 0;
}

编译运行报错:

Segmentation fault: 11

同样的道理,需要初始化指针变量。完成后的示例代码如下:

int main(int argc, const char *argv[])
{
    struct Animal *ptAnimal;
    
    // 初始化结构体指针
    ptAnimal = (struct Animal *)malloc(sizeof(struct Animal));
    
    ptAnimal->name = "dog";
    strcpy(ptAnimal->info, "This is a big dog");
    
    printf("ptAnimal's name: %s, age: %i, info: %s\n", ptAnimal->name, ptAnimal->age, ptAnimal->info);
    
    // 初始化结构体指针的成员指针变量 nextAnimal
    ptAnimal->nextAnimal = (struct Animal *)malloc(sizeof(struct Animal));
    ptAnimal->nextAnimal->name = "dog";
    strcpy(ptAnimal->nextAnimal->info, "This is a big dog");
    
    printf("ptAnimal->nextAnimal's name: %s, age: %i, info: %s\n",
           ptAnimal->nextAnimal->name, ptAnimal->nextAnimal->age, ptAnimal->nextAnimal->info);
    
    return 0;
}

完整示例

main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Animal {
    char *name; //指针成员
    int age;
    char info[200]; //字符数组
    struct Animal *nextAnimal; //指针成员
};

int main(int argc, const char *argv[])
{
    /// 验证结构体指针成员变量
    {
        struct Animal animal;
        
        animal.name = "cat";
        strcpy(animal.info, "This is a cat.");
        printf("animal's name: %s, age: %i, info: %s\n", animal.name, animal.age, animal.info);
        
        printf("animal.nextAnimal: %p\n", animal.nextAnimal);
        
        // 初始化指针变量
        animal.nextAnimal = (struct Animal *)malloc(sizeof(struct Animal));
        
        // 初始化变量
        animal.nextAnimal->name = "cat";
        strcpy(animal.nextAnimal->info, "This is a cat.");
        
        printf("animal.nextAnimal->name: %s, age: %i, info: %s\n", animal.nextAnimal->name, animal.nextAnimal->age, animal.nextAnimal->info);
    }
    
    /// 验证结构体指针
    {
        struct Animal *ptAnimal;
        
        // 初始化结构体指针
        ptAnimal = (struct Animal *)malloc(sizeof(struct Animal));
        
        ptAnimal->name = "dog";
        strcpy(ptAnimal->info, "This is a big dog");
        
        printf("ptAnimal's name: %s, age: %i, info: %s\n", ptAnimal->name, ptAnimal->age, ptAnimal->info);
        
        // 初始化结构体指针的成员指针变量 nextAnimal
        ptAnimal->nextAnimal = (struct Animal *)malloc(sizeof(struct Animal));
        ptAnimal->nextAnimal->name = "dog";
        strcpy(ptAnimal->nextAnimal->info, "This is a big dog");
        
        printf("ptAnimal->nextAnimal's name: %s, age: %i, info: %s\n",
               ptAnimal->nextAnimal->name, ptAnimal->nextAnimal->age, ptAnimal->nextAnimal->info);
    }
    
    return 0;
}

编译

gcc-7 main.c -o main

运行

./main

运行结果如下:

animal's name: cat, age: 0, info: This is a cat.
animal.nextAnimal: 0x0
animal.nextAnimal->name: cat, age: 0, info: This is a cat.
ptAnimal's name: dog, age: 0, info: This is a big dog
ptAnimal->nextAnimal's name: dog, age: 0, info: This is a big dog

Never give up~

已标记关键词 清除标记
定义一个队列结构体,想用init方法初始化一个该结构体指针,testQueue1和testQueue2两种方法都有问题。Queue内部的front和rear指针无法初始化。 但如果是在主程序或者testQueue函数中用malloc初始化,却是可以的。 main程序如下: #include "Queue.h" void testQueue1(); void testQueue2(); void testQueue3(); int main() { printf("\n"); testQueue1(); testQueue2(); testQueue3(); return 0; } void testQueue1() { Queue *q; InitQueue(q); printf("\n"); } void testQueue2() { Queue *q=InitQueue_H(); } void testQueue3() { Queue *q; q=malloc(sizeof(Queue)); q->qfront=malloc(sizeof(QNode)); } 头文件: #include <stdio.h> #include <stdlib.h> //定义数据结构 typedef int DATA; typedef struct _qnode; typedef struct _qnode { DATA data; struct _qnode *next; }QNode; //本定义中,qfront和qrear作为头尾指针,并不存储数据 typedef struct _queue { QNode *qfront; QNode *qrear; }Queue,*LinkedQueue; //初始化一个空队列,返回值1表示初始化成功,0表示初始化失败 int InitQueue(Queue *q); //初始化,返货Queue指针 Queue *InitQueue_H(); //判断是否为空 int IsQEmpty(Queue *q); 程序实现: #include "Queue.h" int InitQueue(Queue *q) { q=(Queue*)malloc(sizeof(Queue)); if(q==NULL)return 0; q->qfront=q->qrear=(QNode*)malloc(sizeof(QNode)); if(q->qfront==NULL) return 0; q->qfront->next=NULL; return 1; } Queue *InitQueue_H() { Queue *q=(Queue*)malloc(sizeof(Queue)); if(q==NULL)return NULL; q->qfront=q->qrear=(QNode*)malloc(sizeof(QNode)); if(q->qfront==NULL) return NULL; q->qfront->next=NULL; return q; } int IsQEmpty(Queue *q) { if(q==NULL||q->qfront==NULL||q->qrear==NULL) return; return q->qfront==q->qrear; }
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页