内容简介:在使用指针之前,务必要将其初始化。这个是我们最早学习 C 语言的时候,书上经常说的一个问题。在工作中,我们反而会经常忘记这条金科玉律。本篇文章的所有代码都经结构体成员指针的初始化,指的是初始化结构体中指针变量的成员。
在使用指针之前,务必要将其初始化。这个是我们最早学习 C 语言的时候,书上经常说的一个问题。在工作中,我们反而会经常忘记这条金科玉律。
本篇文章的所有代码都经 gcc-7
编译器编译过。关于在 macOS 中如何安装和使用 gcc
,可以参考 GCC: Homebrew 安装 GCC 和 Binutils 这篇文章。
结构体成员指针的初始化
结构体成员指针的初始化,指的是初始化结构体中指针变量的成员。
我们举个例子,下面是 Animal
的结构体。
struct Animal{ char *name; //指针成员 int age; char info[200]; //字符数组,本质也是指针变量 struct Animal*nextAnimal; //指针成员 };
结构体 Animal
含有4个成员变量,其中 name
、 info
和 nextAnimal
是指针变量。
写一段测试代码,如下:
int main(int argc, const char *argv[]) { struct Animalanimal; 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 Animalanimal; 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 Animalanimal; 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 Animalanimal; 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; } ``` 编译运行,一切正常。 ```c 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 Animalanimal; 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 Animalanimal; 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
扫码关注,你我就各多一个朋友~
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 【缺陷周话】第39期:解引用未初始化的指针
- NULL 指针、零指针、野指针
- C++ 的一大误区——深入解释直接初始化与复制初始化的区别
- 将数组和矩阵传递给函数,作为C中指针的指针和指针
- 初始化监听端口
- 类初始化导致死锁
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Web Designer's Idea Book, Vol. 2
Patrick McNeil / How / 2010-9-19 / USD 30.00
Web Design Inspiration at a Glance Volume 2 of The Web Designer's Idea Book includes more than 650 new websites arranged thematically, so you can easily find inspiration for your work. Auth......一起来看看 《The Web Designer's Idea Book, Vol. 2》 这本书的介绍吧!