重新分配结构体数组

2023-12-09

我正在尝试为从文件读取或向文件读取或由用户输入的结构数组(实际上是 2 个结构体中的每一个,但为了简单起见,此处包含 1 个结构体)动态重新分配内存。

typedef Struct
{
    char surname[21];
    char firstname[21];
    char username[21];
...
} User;

...在 main() 中:

int size = 0; /* stores no. of structs */
User* user_array = (User *) calloc(1, sizeof(User));
if(user_array == NULL)
{
    printf("Cannot allocate initial memory for data\n");
    exit(1);
}
else
    size++;

然后,我尝试在需要时使用函数调用来增加数组:

int growArray(User user_array*, int size)
{
    User *temp;
    size++;
    temp = (User *) realloc(user_array, (size * sizeof(User));
    if(temp == NULL)
    {
        printf("Cannot allocate more memory.\n");
        exit(1);
    }
    else
        user_array = temp;
    return size;
}

不幸的是,重新分配永远不会起作用。这两个结构体每个实例只有大约 200 字节,将初始大小设置为 10 就可以正常工作,所以我尝试使用 realloc 的方式一定有问题。

系统是 Win 7 64,Core i5,4GB,运行 Quincy(MinGW GUI)。


realloc改变指向的内存的大小user_array到指定的大小,它不会增加它的大小。看到你的函数被调用growArray,我假设你希望它增加数组的大小size,在这种情况下您需要:

int growArray(User **user_array, int currentSize, int numNewElems)
{
    const int totalSize = currentSize + numNewElems;
    User *temp = (User*)realloc(*user_array, (totalSize * sizeof(User)));

    if (temp == NULL)
    {
        printf("Cannot allocate more memory.\n");
        return 0;
    }
    else
    {
        *user_array = temp;
    }

    return totalSize;
}

注意growArray取地址为user_array,其原因在于realloc如果无法将现有块扩展到所需的大小,则可能会移动内存。

使用方法:

int size = 0;
User* user_array = (User *) calloc(1, sizeof(User));
if(user_array == NULL)
{
    printf("Cannot allocate initial memory for data\n");
    exit(1);
}

/* add 10 new elements to the array */
size = growArray(&user_array, size, 10);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重新分配结构体数组 的相关文章

随机推荐

  • 标签替换非 html 链接

    我有一段代码 它将采用如下所示的文本块 示例文本 示例文本http www google com示例文本 使用preg replace callback方法和以下正则表达式 preg replace callback http w crea
  • 对 asp 中的参数化 SQL 语句进行故障排除

    我正在尝试保护一些用我猜是 VB 或 asp 编写的遗留代码 不太确定是否有区别 当我尝试执行该语句时 页面出现内部服务器错误 我确信这是连接的结果 但我不太了解该语言 不知道如何解决它 我对该语言和 ADODB 库的了解来自 W3Scho
  • 如何检查 awk 数组是否为空

    我是 AWK 的新手 试图确定我的数组是否为空 以便如果是的话我可以打印一条消息 通常我习惯于长度函数并且可以这样检查 但 AWK 似乎没有这些 这是我的工作代码 如果解析所有数据后数组中没有任何内容 我只想打印出不同的消息 add to
  • r stat_contour 多边形填充不正确

    当我使用stat contour对于多边形 某些区域不应该被填充 因为那里没有数据 我在图中标记了它们 有谁知道如何避免这种情况 另外 坐标轴和绘图区域之间有空间 如何去掉 这是绘图代码 plot contour lt function d
  • JavaScript 错误:未捕获类型错误:foo 不是函数

    由于某种原因 JavaScript 似乎无法识别我的函数 我在一些 HTML 中有一个按钮
  • 扩展 Material UI 主题中的排版

    是否可以在 Material UI 主题中定义额外的字体 字体系列 我想要得到这样的东西 export const theme createMuiTheme typography fontFamily Open Sans sans seri
  • iPhone SDK,如何获取周五20:00的NSDate对象?

    有谁知道如何获取下周五 20 00 的 NSDate 吗 Yes 本文教你如何获取当前周的星期日 我很快将其调整为周五 20 00 假设采用公历 NSDate today NSDate alloc init NSCalendar grego
  • 在使用 CefSharp 加载远程 JavaScript 时修改它们?

    我正在构建一个自定义浏览器作为远程网站界面的一部分 他们的 GUI 很糟糕 所以我做了一些 JavaScript 修改来让它看起来更好 目前 为了修改其 UI 我使用以下 GreaseMonkey 脚本 在 Firefox 上 UserSc
  • Python 中的吉他弦代码? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我对 Python 很陌生 但对编写可以模拟吉他弦的代码非常感兴趣 我该怎么做呢 或者至少我该如何开始这样做 任何帮助表示赞赏 谢谢你 EDIT 我想看看演奏不同的琴弦 音符等时
  • 使用 D3 的 Geojson 地图仅渲染要素集合中的单个路径

    我正在尝试绘制哥伦比亚某些地区的 geojson 地图 目前它只显示一条路径 我的特征集有 52 个特征 但我只能绘制这一个特征 我不知道我做错了什么 我的代码基于其他教程 我怎样才能显示所有路径 var features mapData
  • 查找字符串中的多个 url。

    resource THIS IS ABOUT WWW JONAKCOMPUTERS COM HTTP HIGHLOW COM AND TESTINGSERVER1 COM 我想将三个网址提取到另一个类似于以下内容的字符串中 all urls
  • 使用 HTML5 Canvas - 围绕任意点旋转图像

    将表盘旋转到半圆形 北半球 图像作为背景 范围可以是 0 180 度 在输入到进行画布转换的方法时 转盘将旋转并停在匹配的值上 这是我根据传递的帮助和示例尝试的phrogz 一般来说 您想要做的是 将上下文转换为画布上对象应围绕其旋转的点
  • 客户端未处理 .NET Remoting 异常

    我检查了其余的远程处理问题 这个具体案例似乎没有得到解决 我设置了 NET Remoting 服务器 客户端 在服务器端 我有一个带有可以引发异常的方法的对象 以及一个将尝试调用该方法的客户端 Server public bool MyEq
  • PHPMailer SMTP 连接失败

    我正在尝试通过 Mandrill 发送电子邮件PHP邮件程序但没有成功 在本地主机上测试 有人能告诉我问题出在哪里吗 这是来自 PHPMailer 的详细信息 2014 04 27 17 51 06 SERVER gt CLIENT 220
  • 访问pom中定义的maven属性

    如何访问普通 Maven 项目和 Maven 插件项目中 pom 中定义的 Maven 属性 Use the 属性 maven 插件编写具体的pomproperties在编译时写入文件 然后在运行时读取该文件 In your pom xml
  • ASP.NET CORE 中的流代理直播流

    我的网络摄像头有一个流 url 它返回 multipart x mixed replace boundary myboundary 的内容类型 假设可以通过以下方式访问它 http mywebcam livrestream cgi 我想在
  • 装饰一个方法

    在我的 Python 应用程序中 我使用事件在不同插件之间进行通信 现在 我想我可以使用装饰器来为我做这件事 而不是手动注册事件的方法 我想让它看起来像这样 events listento event name def myClassMet
  • 使用 chrome.socket API 构建 Web 服务器

    我使用 Chrome 打包应用程序构建了一个网络服务器 我反复看到的问题是 chrome socket accept 和 chrome socket write 不调用它们的回调函数 如果请求率低于每秒 1 个请求 它通常或多或少会可靠地工
  • C# 可能错误的空语句

    在 C 中 我可以这样写 using new MyDisposableClass MethodA 分号会导致显示编译器警告 其中指出可能存在错误的空语句 我没有运行上面的代码 但是该方法不会仍然被调用吗 这种类型的编码约定有什么用途 我在这
  • 重新分配结构体数组

    我正在尝试为从文件读取或向文件读取或由用户输入的结构数组 实际上是 2 个结构体中的每一个 但为了简单起见 此处包含 1 个结构体 动态重新分配内存 typedef Struct char surname 21 char firstname