结构体指针内存——指针数组——字符串指针内存申请

前几天用的结构体,结构体内还包含有结构体指针和数组以及指向字符串的指针,发现自己对这方面的东西还很容易犯错,故现在讲其中容易出错的地方写出来,分享给大家也方便自己日后查看。

typedef struct {
	char name[50];
	char job[50];
	int age;
	int people_id;

} peopleInfo;

typedef struct {

	bool typeAdd;
	bool typeDel;
	int length;

	peopleInfo *info;
	char buildDate[64];
	char lastDate[64];
	char valueStr[256];
} peopleObj;

上面就是两个结构体,peopleObj结构体中包含有上一个结构体的指针和一些数组(开始我在这里不是用的数组,而是用的指针,如char *lastDate,  char * valueStr,为什么最后改为数组,最后再讨论)

peopleObj* meGlobal;

如果有上面的指针定义,一定要为指针申请内存,在这里我使用

meGlobal= (peopleObj *)malloc(sizeof(peopleObj));这里的内存申请使用c标准库的malloc申请。char为1个字节,int为4个字节,指针info为4个字节,所以不算是那两个bool类型的,共为256+64+64+4+4=392个字节。bool类型的c++没有规格为多大,自己可以查下资料,4版的c++
primer上是没有规定的,估计和编译器有关。

这里特别注意在申请内存的时候只为peopleInfo *info;中的info指针申请了4字节的内存,peopleInfo结构体中的变量没有内存,如果需要使用则须为它们申请内存,如:

meGlobal->info = (peopleInfo *)malloc(sizeof(peopleInfo)*10);这样就可以使用info下的变量了,不会报错。

现在讲下为什么后来改使用数组:

开始我是这样定义结构体的:

typedef struct {
	char *name;
	char *job;
	int age;
	int people_id;

} peopleInfo;

typedef struct {

	bool typeAdd;
	bool typeDel;
	int length;

	peopleInfo *info;
	char *buildDate;
	char *lastDate;
	char *valueStr;
} peopleObj;

在结构体内,有很多数据我事先是不确定的,故开始我使用指针指向字符串。

同上面一样,在开始初始化meGlobal= (peopleObj *)malloc(sizeof(peopleObj));时,只为那些指针申请了内存,指针指向的内容并没有内存,故我又使用:

meGlobal->info->job = (char *)malloc(sizeof(char)*50);

meGlobal->info->name = (char *)malloc(sizeof(char)*50);

meGlobal->buildDate=(char *)malloc(sizeof(char)*64);

meGlobal->lastDate=(char *)malloc(sizeof(char)*64);

meGlobal->valueStr=(char *)malloc(sizeof(char)*256);

对于上面的内存申请都是估计的最大,所以存在很多的内存浪费,这里先不讨论。但是若是要使用必须做类似的申请内存,否则指针指向的内容没有内存空间。在后面的程序处理中,如果用到了上面的指针如果指向了其他内存,一定要注意其他内存在某段程序中是否被释放,如果被释放,那开始使用的指针就是野指针没有指向,如果你没有注意到这点,当又把指针直接拿去用就会出现崩溃,所以要在做它用之前为他申请内存或让它指向一段内存,这样才不会出错。

对于指针的使用一定要谨慎,我就是嫌麻烦而且开始出错了,故选用数组。当数组开始定义的时候就有一段内存就被分配给它了。

关于指针和数组,c++ primer现在都不推荐,推荐尽量使用vector容器和迭代器代替。指针还有很多很复杂的用途,慢慢学习吧。

如果有错还请指出,相互学习。

结构体指针内存——指针数组——字符串指针内存申请

时间: 2024-10-07 06:46:50

结构体指针内存——指针数组——字符串指针内存申请的相关文章

读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

原文链接:C语言结构体里的成员数组和指针 复制如下: 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接.微博截图如下.我觉得好多人对这段代码的理解还不够深入,所以写下了这篇文章. 为了方便你把代码copy过去编译和调试,我把代码列在下面: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h>

C语言结构体里的成员数组和指针

struct test{ int i; char *p; }; struct test *str; int a = 1; char *b = "ioiodddddddddddd"; str = (struct test *)malloc(sizeof(struct test));//结构体指针不为null str->i = a; str->p = b; printf("%s\n",str->p); //输出ioiodddddddddddd retu

字符 字符串 字符数组 字符串指针 指针数组

一.字符串指针.字符数组 1. 字符串指针:字符串指针变量本身是一个变量,用于存放字符串的首地址.而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以'\0'作为串的结束. char *ps="C Language"; 可以写为: char *ps;  #ps字符串指针,是指针,是一个变量, ps="C Language"; #ps为字符串的首地址,利用ps++可遍历字符串,字符串存储在以ps为开始地址的地段连续的内存空间中,并以'\0'作为字符串的结束.

C-二维数组, 字符串, 指针

常用的三种数组初始化: int arr[][4] = {{元素}, {元素},{元素},{元素}}; 二维数组本质: 每个元素是一维数组的特殊一维数组; 二维数组与函数: 1. 同一维数组一样, 当作为函数参数的时候, 函数的内部与数组对应的其实是一个指针 2. 所以在作为函数参数的时候, 需要同时传入行, 列 3. 在形参中的二维数组, 行数可以省略, 但是列数不能省略, 实参中对应的二维数组, 行数可以任意, 但是列数必须保持一致 void test(int rows, int cols,

结构体struct和typedef后面接指针的含义

typedef struct file { ... }FileInfo, *FileP; 上述程序中定义了一个结构体,结构体的名字为file,并且给其指针 取个别名为FileP,所以后续程序中出现FileP就相当于是struct file *

#运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标VS指针

#运算符:用于在预编译期将宏参数转换为字符串 #define CONVERS(x)  #x   //注:没用双引号包括. 不同类型的指针占用的内存空间大小相同. 局部变量 定义: a[5]; 打印a[i]时,a[i]为随机数. 若定义a[5]={1,2}; 打印时,a[0]=1;a[1]=2;a[2]=a[3]=a[4]=0; 数组地址与数组名: 1.数组名代表数组首元素的地址.  a=&a[0]; 2.数组的地址需要用取地址符号&才能得到 (&a) 3.数组首元素的地址值与数组的

C语言数组指针(指向数组的指针)

注意:数组指针的定义,与指针数组的区别 转载:http://c.biancheng.net/cpp/biancheng/view/162.html 指向多维数组元素的指针变量 ① 指向数组元素的指针变量[例6.7]输出二维数组各元素的值.这里采用的方法是用基类型为整型的指针变量先后指向各元素,逐个输出它们的值. #include <iostream> using namespace std; int main( ) { int a[3][4]={1,3,5,7,9,11,13,15,17,19

C语言结构体及函数传递数组参数示例

注:makeSphere()函数返回Sphere结构体,main函数中,调用makeSphere()函数,传递的第一个参数为数组,传递的数组作为指针. 版权声明:本文为博主原创文章,未经博主允许不得转载.

C语言结构体及函数传递数组參数演示样例

注:makeSphere()函数返回Sphere结构体,main函数中.调用makeSphere()函数,传递的第一个參数为数组,传递的数组作为指针.