400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

动态版内存分配&动态内存通讯录的实现-创新互联

动态版的通讯录

Ⅰ.动态内存分配1. 为什么存在动态内存分配2. 动态内存函数 2.1 malloc and calloc and free
size_t size
总开辟空间字节个数
size_t numsize_t size
元素个数单个元素开辟空间字节个数
void* ptr
开辟了的空间的首地址
#include#include#includeint main()
{int* ptr1 = (int*)malloc(4); 
//这里必须强制类型转化为int*
    int* ptr2 = (int*)calloc(10,4);
 //这里相当于定义了一个int[10]的数组,只不过地址给了ptr2
    if(ptr1 && ptr2)
    {perror("开辟空间时"); //错误原因
        return 1;
    }
    free(ptr1);
    free(ptr2);
    ptr1 = NULL; ptr2 = NULL;
//释放,并且把置为空指针,以免使用导致越界访问
    return 0;
}
2.2 realloc

void* realloc (void* ptr, size_t size);

void* ptrsize_t size
开辟了的空间首地址改变后的总大小(不要乱搞)
3.常见的错误
  1. 对空指针的解引用
  2. 对动态内存开辟的空间越界访问
    1. 一般就是用了free后的指针
    2. 另外一提,自定义函数中,申请了空间,申请的地址,在函数外部不能使用!因为调用完之后,就会被销毁
  3. 非动态内存的free释放以及多次释放,或者释放的不是首地址
  4. 忘记free,这个可能会导致内存泄漏(养成习惯!这个忘记以后大工程就会出现一些麻烦)
    1. 注意自定义函数内申请的内存一定要“保存”下来,不然销毁了找不到申请的地址了。
4. 柔性数组
struct stu
{ int i;
    char ch;
    int arr[];   //只能是放在最后这个才算数,并且上面至少定义一个成员
}
struct stu
{int i;
   char* str;    
} 

Ⅱ.对通讯录的改版改动一:
struct contact_list
{//struct content list[MAX+1];
	struct content* list;     //并不是柔性数组的方法
	int sz;
	int capacity;
};
改动二:
void init(struct contact_list* pt)
{assert(pt);
	pt->sz = 0;
	//	memset(pt->list, 0, (MAX + 1) * sizeof(struct content));
	struct content* ptr = (struct content*)malloc(NUM * sizeof(struct content));
	if (ptr == NULL)
	{printf("init:%s", strerror(errno));
		return;
	}
	else
	{pt->list = ptr;
		pt->capacity = NUM;
	}
}
改动三:
void add_man(struct contact_list* pt)
{printf("请输入你要添加人的信息(重名者需要加上编号):>\n");
	printf("姓名:>");
	scanf("%s", pt->list[pt->sz].name);
	printf("性别:>");
	scanf("%s", pt->list[pt->sz].sex);
	printf("地址:>");
	scanf("%s", pt->list[pt->sz].address);
	printf("手机号:>");
	scanf("%s", pt->list[pt->sz].phone);
	printf("年龄:>");
	scanf("%d", &pt->list[pt->sz].age);

	pt->sz++;
	system("cls");
	printf("添加成功\n");
	if (pt->sz == pt->capacity)
	{struct content* ptr = (struct content*)realloc(pt->list, (pt->capacity + 2) * sizeof(struct content));
		if (ptr == NULL)
		{	perror("add_man");
			return;
		}
		else
		{	pt->list = ptr;
			pt->capacity += 2; //***
		}
	}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h71P6q41-1672929171246)(2023-01-05-22-23-15.png)]


文章到此结束!谢谢观看 —>内容参考【比特科技】
可以叫我小马,我可能写的不好或者有错误,但是一起加油鸭🦆

这是我的代码仓库!(在马拉圈的22.12里)代码仓库

邮箱:2040484356@qq.com


  1. 动态内存申请的空间,一般由低地址往高地址申请,这也很好理解,因为如果由高到低的话,realloc的时候,每次申请空间的首地址都要变↩︎

  2. 因为指针的解引用也可以用下标访问,((p+i) = p[i])↩︎

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


标题名称:动态版内存分配&动态内存通讯录的实现-创新互联
URL标题:http://mzwzsj.com/article/dgpchi.html

其他资讯

让你的专属顾问为你服务