原文 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);// 初始化结构体指针的成员指针变量 nextAnimalptAnimal->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);// 初始化结构体指针的成员指针变量 nextAnimalptAnimal->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 结构体指针初始化相关推荐

  1. c语言+结构体指针初始化,c语言结构体指针初始化===

    c语言结构体指针初始化 今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以 ...

  2. c语言结构体指针初始化

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  3. C语言结构体指针初始化(转)

    reference: https://www.cnblogs.com/losesea/archive/2012/11/15/2772526.html 今天来讨论一下C中的内存管理. 记得上周在饭桌上和 ...

  4. c语言中结构体的指针初始化,c语言结构体指针初始化

    今天终于看完了C语言深度剖析这本书,对C语言有了进一步的了解与感悟,突然发觉原来自己学C语言的时候学得是那样的迷糊,缺少深入的思考,在重新看书的时候发觉C语言基本教材虽然经典,但是缺乏独到性,老师在讲 ...

  5. 结构体指针初始化问题

    (1)结构体指针是否需要初始化 struct student{ char* name; int score; struct student* next; }stu,*stu1; stu.name=(c ...

  6. Go 结构体指针初始化

    今天遇到一个这样的问题 同样都是查询,上面的就不需要new, 而下面的就需要new 请教了一下大佬, 下面的是一个结构体指针,需要分配内存才能使用 在别的地方也找到了印证,(尽管之前博客提到过这个问题 ...

  7. 关于指针结构体的初始化

    项目场景: 力扣141:循环链表的判定 在VS中初始化链表,涉及到节点结构体的初始化, 问题描述 在VS中初始化链表,涉及到节点结构体的初始化,一开始的写法: typedef struct ListN ...

  8. c语言结构体学习整理(结构体初始化,结构体指针)

    渣渣c的c语言学习之路 1.关于c语言的结构体: 首先我们为什么要用到结构体,我们都已经学了很多int char -等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用, ...

  9. 为什么结构体指针需要malloc申请空间

    例如此时: int init(struct Node**head ) //结构体指针 初始化 { struct Node *newnode = (struct Node *)malloc(sizeof ...

最新文章

  1. rfc6455 WebSockets
  2. 你稀里糊涂学的算法复杂度,原来这么简单!
  3. 16进制输出C语言字符常量,基础C语言:进制、常量
  4. Dubbo 如何成为连接异构微服务体系的最佳服务开发框架
  5. 线性表的链式表示——循环链表
  6. Oracle数据库中调用Java类开发存储过程、函数的方法
  7. 专题目录20211013-ongoing
  8. python document_python 处理document文档 保留原样式
  9. 上海交大计算机网络课件 翁惠玉 ppt,上海交通大学 计算机网络PPT3 翁惠玉.ppt
  10. 我们工作到底为了什么(这篇文章很重要)----强烈推荐
  11. Sublime Text 3使用SublimeLinter配置JS,CSS,HTML语法检查
  12. iOS开发:AFNetworking、MKNetworkKit和ASIHTTPRequest比较
  13. 你必须知道的CSS盒模型,顺利通过阿里面试
  14. 神经网络与深度学习——TensorFlow2.0实战(笔记)(五)(Matplotlib绘图基础<1>python)
  15. UE3 供游戏性程序员的使用的性能最优化方法
  16. JACKSON JSON 操作帮助类
  17. 单词的理解 —— 通过上下文环境
  18. Flink Forward Asia Hackathon 正式启动,10W 奖金等你来!
  19. Python编程 | 随机生成车牌号
  20. html桌面插件,纯JS和CSS3炫酷桌面便签贴纸特效插件

热门文章

  1. 2010年十大安全事件回顾
  2. Linux下vi简明手册
  3. vue 3.0 keep-alive 失效 报错 Cannot read properties of null (reading ‘parentNode‘)
  4. 十大排序算法 python
  5. axios请求数据和拦截
  6. Unity删除工程记录
  7. RS232串口通信(UART的接收部分)
  8. 加载图数据cora、citeseer异常
  9. 在视频海洋里徜徉的年轻人,618都是怎么选手机的?
  10. Process Explorer调试