C语言 结构体使用malloc动态申请内存时,关于如何初始化结构体的解决方法

1.使用bzero函数(Linux平台,Windows可用宏定义解决)

1.1 bzero函数详解

  • 1.1.1 函数原型:void bzero(void *str, int n);
  • 1.1.2 所在头文件:string.h
  • 1.1.3 功能:将字符串str的前n个字节置为0,一般来说n通常取sizeof(str),方便将整块空间直接清零(即初始化)。
  • 1.1.4 返回值:无返回值

1.2 实例

  • 1.2.1 将一个未初始化的数组清零(即初始化)
char str[10];
bzero( str, sizeof(str) );
运行结果

运行结果
-1.2.2 将一个结构体清零(即初始化)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define bzero(a, b)     memset(a, 0, b)		
//博主是在windows平台下运行的,所以自己定义一下
//新建一个结构体
struct student {
	char studentNumber[10];
	int studentFraction;
	char studentId[10];
};
void main() {
	struct student *studentPointer;
	studentPointer = (struct student*)malloc(sizeof(struct student));//在sizeof这儿,如果后面再乘以相应的数值,就能一次性初始化多个结构体
	bzero(studentPointer, sizeof(struct student));

}
运行结果:

运行结果

2. 使用memset函数(Windows)

2.1 memset函数详解

  • 2.1.1 函数原型:void *memset(void *str,int nur,size_t n);
  • 2.1.2 所在头文件:string.h 或 memory.h
  • 2.1.3 作用:将str中前n个字节替换为nur并返回str
  • 2.1.4 优点:是对较大的结构体或数组进行清零操作的一种最快方法
  • 2.1.4 注意事项:由于nur是int类型的,需要注意以下两点:
    • 2.1.4.1 若str指向的地址是char类型的,nur的值可以是任意字符值;

    • 2.1.4.2 若s指向的地址不是char类型,nur的值只能是-1或者0。

    • 原因:因为-1和0转化成二进制后每一位都是一样的,设int型占4个字节,则-1=0XFFFFFFFF, 0=0X00000000。

2.2 实例

memset( str,0,sizeof(str) );
将上面的studentPointer指向的动态申请的内存初始化
memset( studentPointer,0,sizeof(struct student) );
运行结果

运行结果

3. 使用calloc函数

3.1 函数详解

  • 函数原型:void* calloc(unsigned int num,unsigned int size)
  • 所在头文件:stdlib.h
  • 动态申请内存函数之一,相当于用malloc函数申请并且初始化一样,calloc函数会将申请的内存全部初始化为0;
  • 因此,可以直接用calloc函数,不用malloc函数,两者的区别就是一个会将申请的内存初始化,一个不会,大家按自己的需要来使用。

3.2 实例

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct node {
	char name[10];
	int number;
	struct node *next;
};
void main() {
	struct node *Herd;
	Herd = (struct node *)calloc(1, sizeof(struct node));
	system("pause");
}
运行结果

在这里插入图片描述

本人撰写博客纯粹为记录自己在学习过程的遇到的困难、问题的解决办法。如有错误,请大家不吝指教!谢谢!
发布了21 篇原创文章 · 获赞 2 · 访问量 1603

猜你喜欢

转载自blog.csdn.net/tothk/article/details/104149312