C 结构体指针初始化

C 结构体指针初始化原文 C 结构体指针初始化 CSDN 同步发布 转载请注明出处 谢谢 在使用指针之前 务必要将其初始化 这个是我们最早学习 C 语言的时候 书上经常说的一个问题 在工作中 我们反而会经常忘记这条金科玉律 本篇文章的所有代码都经 gcc 7 编译器编译过 关于在 macOS 中如何安装和使用 gcc 可以参考 GCC Homebrew 安装 GCC 和 Binutils 这篇文章 结构体成


原文 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  
        #include  
        #include  
        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  
        #include  
        #include  
        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~
C 结构体指针初始化

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202008.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午8:05
下一篇 2026年3月20日 上午8:05


相关推荐

  • MacBook本地深度部署指南:DeepSeek模型全流程实战教程

    MacBook本地深度部署指南:DeepSeek模型全流程实战教程

    2026年3月16日
    1
  • Android开发—-简单几步教你制作一个简易的音乐播放器

    Android开发—-简单几步教你制作一个简易的音乐播放器前言:本博文只教你编程的思想,就举一个简单的例子来实现我们的简易的音乐播放器,大家不喜勿喷啊友情提示:本博文用到的是AndroidStudio进行开发的,软件安装教程:AndroidStudio安装教程:文章目录:一.缓冲界面实现:二:播放音乐界面:一.缓冲界面实现:在前面的博客中也讲到了关于界面缓冲跳转的方法,详情请查:3种方式实现界面缓冲,为什么要设置这个呢?自我感觉当用户点进应用后,至少有一个缓冲时间,不仅仅是让用户缓冲也是为了让程序内部进行缓冲缓冲,话不多说一起来看看设计:当然首先是界

    2022年7月16日
    18
  • Pycharm中实现查找和替换

    Pycharm中实现查找和替换方法一 快捷键 ctr control shift r replace 替换 方法二

    2026年3月27日
    2
  • 矩阵范数推导_向量范数怎么求

    矩阵范数推导_向量范数怎么求参考自:1999年08月清华大学出版社出版的施妙根的《科学和工程计算基础》。

    2026年1月27日
    4
  • Spring Security身份认证之UserDetailsService[通俗易懂]

    Spring Security身份认证之UserDetailsService[通俗易懂]        之前我们采用了配置文件的方式从数据库中读取用户进行登录。虽然该方式的灵活性相较于静态账号密码的方式灵活了许多,但是将数据库的结构暴露在明显的位置上,绝对不是一个明智的做法。本文通过Java代码实现UserDetailsService接口来实现身份认证。  1.1UserDetailsService在身份认证中的作用  SpringSecurity中进行身份验证的是Aut…

    2025年6月25日
    4
  • Ubuntu下Anaconda和Pycharm的配置

    Ubuntu下Anaconda和Pycharm的配置1 对于 Ubuntu18 04 一开始会有一个系统默认的 python 解释器 是 3 6 版本 位置在 usr bin python3 6 可以通过在 terminal 中输入 python 或者 python3 来查看 2 安装了 Anaconda3 之后 Anaconda 会自带一个 python 解释器 也是 3 6 版本 位置在 home li anaconda3 bin python3 一旦安装了 Anaconda 这个 python 就会变成默认的 在 terminal 里面直接输入 python 显示的位置就是这个

    2026年3月27日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号