版权声明:本文为博主原创文章,对文章内容有任何意见或建议,欢迎与作者单独交流,作者QQ(微信):245924426。 https://blog.csdn.net/zhouzxi/article/details/51892960
问题描述
某结构体的定义如下:
typedef struct
{
int iAge; // 年龄
char szAddr1[100]; // 地址1
char *pszAddr2; // 地址2
char **pszAddr3; // 地址3
} T_PeopleInfo;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
请问如何对结构体中的各个成员变量(尤其是指针变量)进行赋值?
问题分析及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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
在程序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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
在程序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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
在程序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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
在程序4中,我们先用malloc为pszAddr3分配了内存空间,然后便可以使用该指针来接收字符串变量的值(注意,这里是将“Wuhan, China!”赋给了*(tPeopleInfo.pszAddr3))。程序编译和运行都是正常的,输出结果如下:
~/zhouzx/Test/PointerTest> PointerTest
Age=10, Addr1=Chongqing, China!, Addr2=Chengdu, China!, Addr3=Wuhan, China!
总结
本文对结构体中指针赋值问题进行了分析,并用C代码演示了指针的赋值方法。
在实际的C语言项目中,很多程序出现问题,就是对指针的处理不当造成的。因此,熟练掌握各种指针的使用方法,是对一个合格的软件开发人员的基本要求。
- 1楼 a11730820382016-07-14 19:32发表 [回复] [引用] [举报]
- 请问本文代码能够编译通过吗?按照您给出的源码貌似行不通耶
- Re: Programmer_Zhou2016-07-15 07:16发表 [回复] [引用] [举报]
- 可以编译通过,我是在linux下编译的。
结构体初始化及结构体指针.结构体数组.结构体函数的调用赋值等
- wangweijundeqq
- 2017-07-30 15:55:29
- 1559
C语言 结构体与结构体指针用法总结
- SYQ_aa
- 2017-08-20 17:03:18
- 1848
c 结构体中存在指针,指针的不同赋值方法
- hao_rh
- 2017-06-15 10:13:32
- 651
含有指针成员的结构体使用总结
- u012273127
- 2016-08-31 19:54:13
- 11590
结构体指针的定义和引用
- amj0622
- 2009-10-10 11:26:00
- 44974
关于结构体变量指针
- u010456460
- 2016-05-20 15:46:46
- 3568
结构体定义、结构体指针、内存分配、指针、结构体形参的深入理解
- yuanweiming1992
- 2015-02-25 23:17:07
- 3615
c语言中结构体指针
- frank_jb
- 2015-07-29 21:59:57
- 8085
C语言中结构体的直接赋值
- naturebe
- 2012-08-17 15:07:27
- 94086
指针的赋值与引用的赋值
- chenzongduozhu
- 2016-11-19 11:30:04
- 2905
C++ 指针的两种操作,通过指针赋值 & 对指针赋值
- u012560212
- 2017-12-18 14:42:04
- 1740
指针铁律2/3:间接赋值是指针存在的最大意义
- bbs375
- 2016-09-13 08:55:01
- 523
C语言指针的初始化和赋值
- mhjcumt
- 2012-06-28 22:46:55
- 110336
1.4 间接赋值是指针存在的最大意义
- starbarks
- 2017-03-03 13:40:09
- 658
C语言指针详解----指针声明定义赋值
- sinat_35821976
- 2017-02-24 10:22:20
- 1231
c语言中通过指针将数值赋值到制定内存地址
- wht15501032502
- 2017-03-07 19:21:29
- 957