C语言:内存管理

本文详细介绍了C语言中使用typedef进行类型重命名的方法,包括基本数据类型的别名定义和结构体的重命名,以及如何使用typedef定义函数指针。此外,还深入探讨了栈和堆内存的使用,包括malloc和free函数的应用,以及常见内存错误的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、typedef 给类型重命名

 #include <stdio.h>
 
typedef char  INT8;
typedef short INT16;
typedef int   INT32;
typedef long  INT64;

typedef unsigned char  UINT8;
typedef unsigned short UINT16;
typedef unsigned int   UINT32;
typedef unsigned long  UINT64;

(1)结构体的重命名

struct _Student
{
	
};
typedef struct _Student Student;

typedef struct _node
{ 
	int a;
	int b;
}Node;

(2)函数指针

int add(int a, int b)
{
	return a+b;
}

int mul(int a, int b)
{
	return a*b;
}
int show(int a, int b, int c)
{
	return a+b;
}

typedef int (*PFUNC)(int a, int b);

int main()
{
	int   a = 10;
	INT32 b = 20;
	
	struct _Student  s;
	
	Student s1;
	
	struct _node n1;
	Node n2;
	
	int (*p1)(int a, int b) = add;
	
	PFUNC p2 = add;
	
	// PFUNC p3 = show;   不对  函数类型不匹配
	
	PFUNC p4 = mul;
	
	printf ("1 + 2 = %d\n", add(1,2));
	printf ("1 + 2 = %d\n", p1(1,2));
	printf ("1 + 2 = %d\n", p2(1,2));
	printf ("3 * 4 = %d\n", p4(3,4));
	
    return 0;
}

二、栈大小测试

#include <stdio.h>

// #define NUM 1024*1024*7

int a;

int b;

int c = 10;

int main()
{
	//char data[NUM+1000] = {0};
	
	//data[NUM-1+1000] = 12;
	//printf ("num = %d\n", data[NUM-1+1000]);
	
    return 0;
}

三、malloc:在堆上分配空间
void *malloc(size_t size);
参数:要分配的空间大小,单位是字节
返回值:如果分配成功指向分配的空间的指针; 如果分配空间失败,返回NULL

free: 释放堆上的空间
void free(void *ptr);
参数:指向要释放的空间的指针

1、分配单个变量空间

int main()
{
	// 分配一个 int 型变量
	int *pa = (int*)malloc(sizeof(int)/sizeof(char));
	if (NULL == pa)
	{
		printf ("空间分配失败\n");
	}
	
	
	printf ("释放前: %p\n", pa); 
	free(pa);    // 释放空间
	printf ("释放后: %p\n", pa);
	
	pa = NULL;
	free(pa);
    return 0;
}

2、分配一维数组 int a[10]

int main()
{
	int *pa = (int*)malloc(sizeof(int)/sizeof(char)*10);
	if (NULL == pa)
	{
		printf ("空间分配失败\n");
	}
	
	int i;
	for (i = 0; i < 10; i++)
		pa[i] = i;
	
	
	for (i = 0; i < 10; i++)
	{
		printf ("pa[%d] = %d\n", i, pa[i]);
	}
	
	free(pa);
    return 0;
}

3、分配二维数组 int a[3][4]

int main()
{
	// 分配连续的空间
	int (*pa)[4] = (int (*)[4])malloc(sizeof(int)/sizeof(char)*3*4);
	if (NULL == pa)
	{
		printf ("空间分配失败\n");
	}
	
	pa[1][2] = 10;
	free(pa);
    return 0;
}

int main()
{
	int **p = (int **)malloc(sizeof(int*)/sizeof(char)*3);
	if (NULL == p)
	{
		printf ("申请空间失败\n");
	}	
	int i;
	for (i = 0; i < 3; i++)
	{
		p[i] = (int *)malloc(sizeof(int)/sizeof(char)*4);
		if (NULL == p[i])
			;
	}

	for (i = 0; i < 3; i++)
	{
		free(p[i]);
	}
	free(pa);
    return 0;
}

四、内存错误

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

typedef struct student
{
	int id;
	char *name;
}Student;

typedef struct teacher
{
	int id;
	char name[20];
}Teacher;

int main1()
{
	Student *ps = (Student*)malloc(sizeof(Student)/sizeof(char));
	if (NULL == ps)
  {
	printf(“申请空间失败\n”);
}
	ps->id = 10;
	ps->name = (char*)malloc(sizeof(char)*20);
	strcpy(ps->name, "小明");
	
	printf ("id = %d, name = %s\n", ps->id, ps->name);
	
	Teacher *pt = (Teacher*)malloc(sizeof(Teacher)/sizeof(char));
	if (NULL == pt)
	{
		printf(“申请空间失败\n”);
	}
	
	pt->id = 20;
	strcpy(pt->name, "小红");
	printf ("id = %d, name = %s\n", pt->id, pt->name);
	
    return 0;
}

int main()
{
	char *buf = "hello world";
	int len = strlen(buf);
	
	// 字符串要预留 \0 的空间
	char *ps = (char*)malloc(sizeof(char)*(len+1));
	
	strcpy(ps, buf);
	
	printf("%s\n", ps);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值