m0_70808774 2023-04-18 20:11 采纳率: 100%
浏览 21
已结题

C语言编写通讯录realloc问题

用C语言编写通讯录存放联系人信息,开辟动态空间,初始时设置容量为2人,容量满则扩充容量变为4人,但是输入结束后打印,第二个联系人变成乱码。继续扩大容量至6人,第3人与第4人不乱码,只有第二个人发生问题,请问是为什么呢?刚学没多久,好慌乱

头文件中:

//插入头文件
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NUM 2

struct people
{
    char name[30];
    int age;
    char num[30];
};
struct contact
{
    struct people *data;
    int sz;
    int capacity;

};

//初始化
void first(struct contact* con);
//读文件
void read(struct contact* con);
//添加用户
void Add(struct contact* con);
void write(struct contact* con);
void exit(struct contact* con);

函数源代码:

#include"contact.h"
//初始化
void first(struct contact* con)
{
    struct people*str = (struct people*)malloc(sizeof(struct people));
    if (str == NULL)
    {
        perror(first);
        printf("初始化失败\n");
    }
    else
    {
        con->data = str;       //编译到这里con->data[1]里的内容就变成了一堆问号
        con->sz = 0;
        con->capacity = NUM;
    }
}
//打印出联系人
void show(struct contact* con)
{
    int i = 0;
    printf("%-10s %-10s %-10s\n", "name", "age", "num");
    for (i = 0; i < con->sz; i++)
    {
        printf("%-10s %-10d %-10s\n", con->data[i].name, con->data[i].age, con->data[i].num);
    }
}
//检查是否需要扩容
void Check(struct contact *con)
{
    if (con->sz == con->capacity)
    {
        struct people* str= (struct people*)realloc(con->data, sizeof(struct people) * (NUM + con->capacity));
        if (str == NULL)
        {
            perror(Check);
            printf("增容失败");
            return;
        }
        else
        {
            con->data = str;
            con->capacity += NUM;
            show(con);
        }
    }
    
}
//存入联系人
void Add(struct contact* con)
{
    Check(con);
    printf("请输入姓名:");
    scanf("%s", con->data[con->sz ].name);
    printf("请输入年龄:");
    scanf("%d", &con->data[con->sz].age);
    printf("请输入号码:");
    scanf("%s", con->data[con->sz].num );
    con->sz++;
    printf("输入成功\n");

img

  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2023-04-18 20:28
    关注

    问题出在Add函数中,每次添加联系人时,使用了con->data[con->sz]来存储新的联系人信息,但是在Check函数中,如果需要扩容,重新分配了内存空间,此时con->data指向的是新的内存空间,而之前使用con->data[con->sz]存储的联系人信息并没有被复制到新的内存空间中,因此第二个联系人的信息就变成了乱码。

    解决方法是,在Check函数中,重新分配内存空间后,需要将之前存储的联系人信息复制到新的内存空间中。可以使用memcpy函数来实现。
    修改后的Check函数如下:

    void Check(struct contact *con)
    {
        if (con->sz == con->capacity)
        {
            struct people* str= (struct people*)realloc(con->data, sizeof(struct people) * (NUM + con->capacity));
            if (str == NULL)
            {
                perror(Check);
                printf("增容失败");
                return;
            }
            else
            {
                memcpy(str, con->data, sizeof(struct people) * con->sz); //复制联系人信息到新的内存空间中
                con->data = str;
                con->capacity += NUM;
                show(con);
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月27日
  • 已采纳回答 4月19日
  • 创建了问题 4月18日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效