C 结构体指针初始化

c语言中结构体的指针初始化,c语言结构体指针初始化 今天终于看完了C语言深度剖析这本书,对C语言有了进一步的了解与感悟,突然发觉原来自己学C语言的时候学得是那样的迷糊,缺少深入的思考,在重新看书的时候发觉C语言基本教材虽然经典,但是缺乏独到性,老师在讲解的过程中也就照本宣科了,没有多大的启迪。看到C语言内存管理这块,发觉还是挺有用的,当然平时在编程时基本上就没有考虑过内存问题。定义了指针变量,没有为指针分配内存,即指针没有在内存中指向一块合法的内存... 阅读详情
AI摘要

本文详细介绍了在C语言中初始化结构体指针和结构体成员指针的重要性及方法。通过实例展示了未初始化指针导致的段错误,并提供了正确初始化的代码示例。


原文 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 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);

	free(animal.nextAnimal);
    
    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);

	free(animal.nextAnimal);
    
    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);

	free(animal.nextAnimal);
    
    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);

	free(ptAnimal->nextAnimal);
	free(ptAnimal);
    
    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);
	
		free(animal.nextAnimal);
    }
    
    /// 验证结构体指针
    {
        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);

		free(ptAnimal->nextAnimal);
        free(ptAnimal);
    }
    
    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语言中的结构体指针 在C语言中,结构体是一种用户自定义的数据类型,可以将不同类型的变量组合在一起形成一个更复杂的数据结构。而结构体指针则是指向结构体变量地址的指针。通过结构体指针,我们可以动态访问结构体成员、传递结构体到函数以及进行内存管理等操作。结构体指针提供了一个更加灵活和高效的方式来操作结构体,特别是在处理大型数据结构时,指针的使用可以节省内存并提高程序性能。结构体指针是C语言中非常重要的概念,它使得我们能够更加高效、灵活地操作结构体。通过结构体指针,我们可以动态创建结构体、传递结构体到函数中、优化内存使用等。 阅读详情

相关推荐

实测对比:DINOv2、CLIP、ResNet在图像相似度任务上谁更强?(含Python代码与避坑指南)

本文通过实测对比DINOv2、CLIP和ResNet在图像相似度任务中的表现,提供Python代码实现与避坑指南。实验结果显示,DINOv2在精度上表现最佳,CLIP在多模态场景中优势明显,而ResNet则在计算效率上更优。文章还针对不同业务场景给出了具体选型建议,帮助开发者在图像搜索和版权检测等项目中做出更明智的技术决策。

weixin_30588381的博客 288

关于指针结构体的初始化

关于结构体指针来初始化的小坑

weixin_52297124的博客 6089

S32K144(14)ADC

1、简介 开发板S32K144+S32DS+JLINK,裸机版的程序编写 S32K14x包含两个12位ADC模块,ADC0和ADC1 应用程序可能需要ADC的连续采样(4K采样/秒),这可能对CPU有相当大的负载。虽然使用可编程延迟块(PDB)来触发ADC可能会减少一些CPU负载,但当ADC以非常高的速率采样或PDB被绕过时,ADC支持DMA请求功能以获得更高的性能。ADC可以在转换完成时触发DMA(通过DMA请求)。TRGMUX会根据不同的应用需求,使用软件为用户提供更灵活的DMA触发方案,例如,可

朗朗上口就行啦的博客 1万+

如何初始化结构体类型的指针变量

需要注意的是,对于使用 new 运算符动态分配的结构体指针,在使用完之后,需要手动释放内存(使用 delete 运算符)。而对于指向已存在的结构体实例的指针,则不需要显式释放内存。这样就创建了一个名为 p 的指向 MyStruct 结构体的指针,并将其指向了名为 obj 的 MyStruct 结构体实例。这样就创建了一个名为 p 的指向 MyStruct 结构体的指针,并分配了足够的内存以存储该结构体的成员变量和成员函数。

xinxin的博客 1960

Anaconda创建python环境常见命令

Anaconda功能庞大,其可以理解为一个工具,也是一个可执行命令。Anaconda可以创建多个python环境,且python环境间相互独立。

m0_59405106的博客 1万+

【ArcGIS风暴】ArcGIS 10.2导入Excel数据X、Y坐标(经纬度、平面坐标),生成Shapefile点数据图层

用过CASS的人都知道,野外数字测图得到的点数据(平面坐标)可以直接导入到CASS中,进一步绘制地形图。那么,带有坐标的数据能不能在ArcGIS中实现点图层的生成呢?答案是必须的! 本文以气象台站shp数据的生成为例,详细介绍ArcGIS 10.2中导入X、Y坐标(这里指的是经度、纬度),生成Shapefile点数据的流程。 相关阅读:《全站仪、RTK测量坐标数据在CASS和ArcGIS中展点的区别和联系》 目录 1、数据准备 2、添加X、Y数据 3、属性表连接(Join) 4、导出为Sh.

智慧空间实验室 10万+

结构体指针说

今天来讨论一下C中的内存管理。 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左右孩子指针使用时难道有初始化吗 那时我不知怎么的想不出理由,虽然我还是坚信要初始化的 过了几天这位同事说他试了一下,结构体中的成员指针不经过初始化是可以用(左子树和右子树指针) 那

北落师门'的专栏 1585

51单片机入门指南-基于STC89C52(持续更新)

一、环境介绍 编程IDE: keil5 单片机型号: STC89C51/52 开发板: 普中科技的开发板 完整PDF资源下载地址:https://download.youkuaiyun.com/download/xiaolong1126626497/19785856 二、51单片机开发手册介绍 2.1 前言 51单片机是对所有兼容Intel 8031指令系统的单片机的统称。 该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最.

8801

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

出处:https://blog.youkuaiyun.com/as480133937/article/details/83473208 目录 1、C语言结构体 1.1几种常用的结构体定义 1.2注意: 2、关于结构体变量的定义和引用 3、结构体的存储(内存对齐) 3.1结构体成员优化 4、结构体自引用 5、结构体的不完整声明 6、结构体传参 结论 7、结构体变量的初始化 7.1定义时...

蓝色鲜橙多的博客 5222

Nature Communications|马兰戈尼效应构建空心金字塔微阵列制备高灵敏度柔性电容式压力传感器(健康监测/柔性压力传感/柔性电子/人机交互)

三维(3D)微结构因其在柔软性、轻质化、对3D表面的贴合性和可压缩性方面的显著优势,已经在生物医学监测、人机接口、机器人触觉和微型飞行器等领域引起了广泛关注。柔性电容式压力传感器(CPSs),由两片平行板组成,中间夹着一层软介电薄膜,具有设备构造简单、高灵敏度和快速响应速度等众多吸引人的优点。结构化介电层的三维机械设计在决定传感器性能方面起着至关重要的作用,如灵敏度(这是压力传感器的关键特性,因为它决定了感知微小压力和获取更多细节的能力,如轻柔触摸和脉搏检测)。

感知科学前沿 526

Dify智能体开发:Dify文件上传

相较于聊天文本,文档文件能够承载大量的信息,例如学术报告、法律合同。受限于 LLM 自身仅能够支持文件或图片,难以获取文件内更加丰富的上下文信息,应用的使用者不得不手动复制粘贴大量信息与 LLM 对话,增加了许多不必要的使用成本。

王国平的博客 2591

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

c语言结构体指针初始化 今天来讨论一下C中的内存管理。记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面我说所有指针使用前都必须初始化,结构体中的成员指针也是一样有人反驳说,不是吧,以前做二叉树算法时,他的左右孩子指针使用时难道有初始化吗那时我不知怎么的想不出理由,虽然我还是坚信要初始化的过了几天这位同事说他试了一下,结构体中的成员指针不经过初始化是可以用(左子树和右子树指针)那时在忙着...

weixin_29914581的博客 713

学Simulink——基于Simulink的Buck-Boost变换器双闭环PI+抗饱和设计建模示例

本文详细介绍了基于Simulink的非反相Buck-Boost变换器双闭环控制设计方法。针对Buck-Boost变换器特有的右半平面零点(RHPZ)和控制挑战,提出了电压-电流双闭环PI控制架构,并集成抗积分饱和机制。通过Simulink建模,实现了主电路、电流内环PI、电压外环PI、PWM及占空比限幅等模块的搭建,验证了在输入电压跌落(20V→10V)和负载突变(2A→4A)等场景下的稳定性能。仿真结果表明,输出电压波动小于0.35V,恢复时间快于1ms,电感电流有效限幅。文章还讨论了工程实践要点和扩展方

xiaoheshang_123的博客 318

c语言结构体指针初始化

c语言结构体指针初始化 今天来讨论一下C中的内存管理。 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左右孩子指针使用时难道有初始化吗 那时我不知怎么的想不出理由,虽然我还是坚信要初始化的 过了几天这位同事说他试了一下,结构体中的成员指针不经过

XIAO_PING_PING的专栏 1297

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

c语言结构体指针成员初始化

今天遇到一个奇怪的问题,错误提示段错误,明显是指针操作有问题。找了N久才把问题定位在自定义的链表上。next指针一直有数据。 struct S{ void (*call)(); S *next; };上面一个简单的结构体,在程序中: struct S *s = NULL; s = (struct S *)malloc(

raining_heart的专栏 5484

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

c语言 初始化结构体指针,结构体指针需要初始化

过年过的大脑已经瓦特了。#include #define N 10#define MAXSIZE 100typedef struct {int r[MAXSIZE+1];/* 用于存储要排序数组 */int length;/* 用于记录顺序表的长度 */} SqList;int main(void) {SqList sq;sq.length = N;printf("%d", sq.length);...

weixin_36477469的博客 1461

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

c语言结构体指针定义及初始化,结构体的初始化和引用及指向结构体变量的指针变量(C语言)...

1、首先咱们来了解关于结构体以及结构体数组的概念。自定义结构体:数组struct weapon{char name[20];int atk;int price;};它是"weapon"型(相似于咱们熟知的int型,String型等),里面有一个char类型,两个int类型。3d如何给这个结构体赋值以及访问里面的属性?指针struct weapon weapon_1 = {"weapon_name"...

weixin_39862899的博客 963

c语言结构体学习整理(结构体初始化,结构体指针)_c++ 结构体中分配了指针,初始化结构体

首先我们要知道memset在进行赋值时,是按字节为单位来进行赋值的,每次填充的数据长度为一个字节,而对于其他类型的变量,比如int,占4个字节 所以sizeof(str)=40;请注意,在我们进行数组初始化的时候如果定义的数组过长,而我们只初始化了一部分数据,对于未初始化的数据如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’我们知道,指针指向的是变量所占内存的首地址,在结构体中,指针指向的是结构体变量的起始地址,当然也可指向结构体变量的元素。

2401_85014013的博客 1081

C语言结构体初始化和结构体指针

结构体初始化#include <stdio.h> //结构体的声明和定义方法 //1.声明和定义分离 struct weapon{ char name[20]; int atk; int price; }; //声明 //定义 struct weapon weapon_1; //==================================== // //2.同时进行

liuzp111的专栏 9864

C语言结构体详解:定义、初始化和指针使用

在C语言中,结构体(Structure)是一种用户定义的数据类型,可以将多个不同类型的数据组织在一起,形成一个自定义的复合数据类型。结构体由一个或多个成员组成,每个成员可以是不同类型的数据。在C语言中,可以通过使用structstruct 结构体名 {//成员列表 数据类型 成员名 1;数据类型 成员名 2;//... };根据给定的内容,我们可以定义一个名为Node的结构体,其中包含三个成员:姓名、年龄和得分。int age;在上述示例中,我们定义了一个Node。

weixin_47712251的博客 1550
上一篇: 反向代理
下一篇: C语言中free、malloc 等内存管理函数
veryitman
博客等级 码龄16年 472粉丝 310原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值