结构体中指针赋值问题的分析及C代码示例
来源:互联网 发布:淘宝的主营类目怎么改 编辑:程序博客网 时间:2024/05/16 17:29
问题描述
某结构体的定义如下:
typedef struct{ int iAge; // 年龄 char szAddr1[100]; // 地址1 char *pszAddr2; // 地址2 char **pszAddr3; // 地址3} T_PeopleInfo;
请问如何对结构体中的各个成员变量(尤其是指针变量)进行赋值?
问题分析及C代码示例
我们可以看到,在结构体T_PeopleInfo中,pszAddr2和pszAddr3均为指针,其中pszAddr2为一级指针,pszAddr3为二级指针。本文的重点,就是要找到对一级指针和二级指针赋值的正确方法。
我们把结构体T_PeopleInfo放到具体的C代码中,以直观地展现对结构体中的各个成员变量的赋值方法。
我们首先编写如下程序(程序1):
/*********************************************************************** 版权所有 (C)2016, Zhou Zhaoxiong。** 文件名称:PointerTest.c* 文件标识:无* 内容摘要:演示指针的用法* 其它说明:无* 当前版本:V1.0* 作 者:Zhou Zhaoxiong* 完成日期:20160712***********************************************************************/#include <stdio.h>// 重定义数据类型typedef signed int INT32;typedef unsigned int UINT32;typedef unsigned char UINT8;// 结构体定义typedef struct{ UINT32 iAge; // 年龄 UINT8 szAddr1[100]; // 地址1 UINT8 *pszAddr2; // 地址2 UINT8 **pszAddr3; // 地址3} T_PeopleInfo;/***************************************************************** 功能描述: 主函数* 输入参数: 无* 输出参数: 无* 返 回 值: 0-执行完成* 其他说明: 无* 修改日期 版本号 修改人 修改内容* -------------------------------------------------------------* 20160712 V1.0 Zhou Zhaoxiong 创建****************************************************************/INT32 main(void){ T_PeopleInfo tPeopleInfo = {0}; // 结构体变量赋值 // 对iAge赋值 tPeopleInfo.iAge = 10; // 对szAddr1赋值 strncpy(tPeopleInfo.szAddr1, "Chongqing, China!", strlen("Chongqing, China!")); // 对pszAddr2赋值 strncpy(tPeopleInfo.pszAddr2, "Chengdu, China!", strlen("Chengdu, China!")); // 对pszAddr3赋值 strncpy(tPeopleInfo.pszAddr3, "Wuhan, China!", strlen("Wuhan, China!")); // 打印变量的值 printf("Age=%d, Addr1=%s, Addr2=%s, Addr3=%s", tPeopleInfo.iAge, tPeopleInfo.szAddr1, tPeopleInfo.pszAddr2, tPeopleInfo.pszAddr3); return 0;}
在程序1中,我们按照对结构体中的数组的赋值方法对指针赋值,程序可以编译通过,但运行的时候,程序便会挂掉。究其原因,是因为没有为pszAddr2和pszAddr3指针分配内存空间。
我们对程序1进行改进,编写出以下程序(程序2):
/*********************************************************************** 版权所有 (C)2016, Zhou Zhaoxiong。** 文件名称:PointerTest.c* 文件标识:无* 内容摘要:演示指针的用法* 其它说明:无* 当前版本:V1.0* 作 者:Zhou Zhaoxiong* 完成日期:20160712***********************************************************************/#include <stdio.h>// 重定义数据类型typedef signed int INT32;typedef unsigned int UINT32;typedef signed char INT8;// 结构体定义typedef struct{ UINT32 iAge; // 年龄 INT8 szAddr1[100]; // 地址1 INT8 *pszAddr2; // 地址2 INT8 **pszAddr3; // 地址3} T_PeopleInfo;/***************************************************************** 功能描述: 主函数* 输入参数: 无* 输出参数: 无* 返 回 值: 0-执行完成* 其他说明: 无* 修改日期 版本号 修改人 修改内容* -------------------------------------------------------------* 20160712 V1.0 Zhou Zhaoxiong 创建****************************************************************/INT32 main(void){ T_PeopleInfo tPeopleInfo = {0}; // 结构体变量赋值 // 对iAge赋值 tPeopleInfo.iAge = 10; // 对szAddr1赋值 strncpy(tPeopleInfo.szAddr1, "Chongqing, China!", strlen("Chongqing, China!")); // 对pszAddr2赋值 tPeopleInfo.pszAddr2 = (INT8 *)malloc(100); if (tPeopleInfo.pszAddr2 == NULL) { return -1; } strncpy(tPeopleInfo.pszAddr2, "Chengdu, China!", strlen("Chengdu, China!")); // 对pszAddr3赋值 tPeopleInfo.pszAddr3 = (INT8 *)malloc(100); if (tPeopleInfo.pszAddr3 == NULL) { return -2; } strncpy(tPeopleInfo.pszAddr3, "Wuhan, China!", strlen("Wuhan, China!")); // 打印变量的值 printf("Age=%d, Addr1=%s, Addr2=%s, Addr3=%s\n", tPeopleInfo.iAge, tPeopleInfo.szAddr1, tPeopleInfo.pszAddr2, tPeopleInfo.pszAddr3); return 0;}
在程序2中,我们先使用malloc为pszAddr2和pszAddr3分配了内存空间(注意,执行malloc之后,要判断指针是否为空),此时就可以将变量值赋给它们。程序编译和运行都是正常的,输出结果如下:
~/zhouzx/Test/PointerTest> PointerTest
Age=10, Addr1=Chongqing, China!, Addr2=Chengdu, China!, Addr3=Wuhan, China!
除了程序2可以实现对一级指针和二级指针的正常赋值之外,我们还可以编写如下程序(程序3):
/*********************************************************************** 版权所有 (C)2016, Zhou Zhaoxiong。** 文件名称:PointerTest.c* 文件标识:无* 内容摘要:演示指针的用法* 其它说明:无* 当前版本:V1.0* 作 者:Zhou Zhaoxiong* 完成日期:20160712***********************************************************************/#include <stdio.h>// 重定义数据类型typedef signed int INT32;typedef unsigned int UINT32;typedef signed char INT8;// 结构体定义typedef struct{ UINT32 iAge; // 年龄 INT8 szAddr1[100]; // 地址1 INT8 *pszAddr2; // 地址2 INT8 **pszAddr3; // 地址3} T_PeopleInfo;/***************************************************************** 功能描述: 主函数* 输入参数: 无* 输出参数: 无* 返 回 值: 0-执行完成* 其他说明: 无* 修改日期 版本号 修改人 修改内容* -------------------------------------------------------------* 20160712 V1.0 Zhou Zhaoxiong 创建****************************************************************/INT32 main(void){ T_PeopleInfo tPeopleInfo = {0}; // 结构体变量赋值 // 对iAge赋值 tPeopleInfo.iAge = 10; // 对szAddr1赋值 strncpy(tPeopleInfo.szAddr1, "Chongqing, China!", strlen("Chongqing, China!")); // 对pszAddr2赋值 tPeopleInfo.pszAddr2 = "Chengdu, China!"; // 对pszAddr3赋值 tPeopleInfo.pszAddr3 = "Wuhan, China!"; // 打印变量的值 printf("Age=%d, Addr1=%s, Addr2=%s, Addr3=%s\n", tPeopleInfo.iAge, tPeopleInfo.szAddr1, tPeopleInfo.pszAddr2, tPeopleInfo.pszAddr3); return 0;}
在程序3中,我们直接将字符串赋给了pszAddr2和pszAddr3,也就是将这两个字符串的首地址赋给了指针。那么,指针所指向的地址中存放的内容就是字符串的值。程序编译和运行都是正常的,输出结果如下:
~/zhouzx/Test/PointerTest> PointerTest
Age=10, Addr1=Chongqing, China!, Addr2=Chengdu, China!, Addr3=Wuhan, China!
另,对于二级指针的赋值,我们还可以编写如下程序(程序4):
/*********************************************************************** 版权所有 (C)2016, Zhou Zhaoxiong。** 文件名称:PointerTest.c* 文件标识:无* 内容摘要:演示指针的用法* 其它说明:无* 当前版本:V1.0* 作 者:Zhou Zhaoxiong* 完成日期:20160712***********************************************************************/#include <stdio.h>// 重定义数据类型typedef signed int INT32;typedef unsigned int UINT32;typedef signed char INT8;// 结构体定义typedef struct{ UINT32 iAge; // 年龄 INT8 szAddr1[100]; // 地址1 INT8 *pszAddr2; // 地址2 INT8 **pszAddr3; // 地址3} T_PeopleInfo;/***************************************************************** 功能描述: 主函数* 输入参数: 无* 输出参数: 无* 返 回 值: 0-执行完成* 其他说明: 无* 修改日期 版本号 修改人 修改内容* -------------------------------------------------------------* 20160712 V1.0 Zhou Zhaoxiong 创建****************************************************************/INT32 main(void){ T_PeopleInfo tPeopleInfo = {0}; // 结构体变量赋值 // 对iAge赋值 tPeopleInfo.iAge = 10; // 对szAddr1赋值 strncpy(tPeopleInfo.szAddr1, "Chongqing, China!", strlen("Chongqing, China!")); // 对pszAddr2赋值 tPeopleInfo.pszAddr2 = "Chengdu, China!"; // 对pszAddr3赋值 tPeopleInfo.pszAddr3 = (INT8 *)malloc(100); if (tPeopleInfo.pszAddr3 == NULL) { return -1; } *(tPeopleInfo.pszAddr3) = "Wuhan, China!"; // 打印变量的值 printf("Age=%d, Addr1=%s, Addr2=%s, Addr3=%s\n", tPeopleInfo.iAge, tPeopleInfo.szAddr1, tPeopleInfo.pszAddr2, *(tPeopleInfo.pszAddr3)); return 0;}
在程序4中,我们先用malloc为pszAddr3分配了内存空间,然后便可以使用该指针来接收字符串变量的值(注意,这里是将“Wuhan, China!”赋给了*(tPeopleInfo.pszAddr3))。程序编译和运行都是正常的,输出结果如下:
~/zhouzx/Test/PointerTest> PointerTest
Age=10, Addr1=Chongqing, China!, Addr2=Chengdu, China!, Addr3=Wuhan, China!
总结
本文对结构体中指针赋值问题进行了分析,并用C代码演示了指针的赋值方法。
在实际的C语言项目中,很多程序出现问题,就是对指针的处理不当造成的。因此,熟练掌握各种指针的使用方法,是对一个合格的软件开发人员的基本要求。
- 结构体中指针赋值问题的分析及C代码示例
- 结构体中指针赋值问题的分析及C代码示例
- C/C++中结构体变量及指向结构体指针变量的内存分配问题
- C语言中结构体赋值问题的讨论
- C语言中结构体赋值问题的讨论
- C中结构体赋值问题
- c 结构体中存在指针,指针的不同赋值方法
- 关于指针结构体函数中指针变量的赋值&的问题思路
- (2011.07.06)C++ 结构体中字符指针在main中使用new的赋值问题。
- C语言指针与结构体,示例代码
- C语言:结构体中一级指针和二级指针的创建与释放示例
- C语言:结构体中一级指针和二级指针的创建与释放示例
- C语言结构体中指针的复制问题
- C中结构体是否能用=运算符直接赋值的问题
- 结构体指针赋值
- C语言指针的赋值问题
- C语言字符指针赋值的问题
- 关于C语言结构体的赋值(复制)问题
- scala 基本语法-4 ok
- 优雅编程之这样取名字,你就"正常"了!
- 广播接收者BroadcastReceiver
- Python 机器学习有关机器学习工具包(Numpy、Theano、Caffe等)安装汇总
- Android安全:dex2jar、jd-gui和AXMLPrinter2
- 结构体中指针赋值问题的分析及C代码示例
- VS2010中“工具>选项中的VC++目录编辑功能已被否决”解决方法
- POJ 1041 欧拉回路
- 标签语义化
- MySQL InnoDB存储引擎下的锁
- spark streaming的NetworkWordCount实例理解
- HBase学习之五:HBase的RowKey设计原则
- 【翻译】LearnYouSomeErlangForGreatGood(二):起始
- exp,imp