在使用指针之前,务必要将其初始化。这个是我们最早学习 C 语言的时候,书上经常说的一个问题。在工作中,我们反而会经常忘记这条金科玉律。
本篇文章的所有代码都经 gcc-7
编译器编译过。关于在 macOS 中如何安装和使用 gcc
,可以参考 GCC: Homebrew 安装 GCC 和 Binutils 这篇文章。
结构体成员指针的初始化
结构体成员指针的初始化,指的是初始化结构体中指针变量的成员。
我们举个例子,下面是 Animal
的结构体。
1 | struct Animal { |
结构体 Animal
含有4个成员变量,其中 name
、info
和 nextAnimal
是指针变量。
写一段测试代码,如下:
1 | int main(int argc, const char *argv[]) |
运行结果正常,终端输出如下:
1 | animal's name: (null), age: 0, info: |
我们来验证一下 Animal *nextAnimal
在没有初始化的情况下,会不会有什么问题。
1 | int main(int argc, const char *argv[]) |
程序编译没有问题,运行报错
1 | animal's name: (null), age: 0, info: |
修改一下代码,初始化一下 animal.nextAnimal
这个指针,如下:
1 | int main(int argc, const char *argv[]) |
再次编译重新运行,还是报错。还需要初始化 animal.nextAnimal->name
这个变量。
1 | int main(int argc, const char *argv[]) |
编译运行,一切正常。
1 | animal's name: (null), age: 0, info: |
通过上面的例子,结构体指针变量有些会给默认值,有些又不会给,所以都要初始化指针变量。修改一下代码,示例如下:
1 |
|
结构体指针的初始化
指的是初始化结构体指针变量。
1 | int main(int argc, const char *argv[]) |
编译运行报错:
1 | Segmentation fault: 11 |
同样的道理,需要初始化指针变量。完成后的示例代码如下:
1 | int main(int argc, const char *argv[]) |
完整示例
main.c
1 |
|
编译
1 | gcc-7 main.c -o main |
运行
1 | ./main |
运行结果如下:
1 | animal's name: cat, age: 0, info: This is a cat. |
小荷才露尖尖角,早有蜻蜓立上头~