【问题标题】:C struct and memory allocationC 结构和内存分配
【发布时间】:2014-03-26 01:21:13
【问题描述】:

当您为内存分配空间时,如何判断是否需要为其分配更多空间?是否有一个检查或者您可以对您的新内存进行检查以确保它运行良好? (为结构分配内存)。

因为我在想一个结构是一组数据,即使我经常传递它,它也不应该比结构的大小正确吗?

【问题讨论】:

  • 不清楚你在问什么。您是在谈论使用malloc 为单个结构对象分配空间吗? struct foo *ptr = malloc(sizeof *ptr); 是否解决了您正在尝试做的事情?
  • malloc(sizeof(struct T)) 总是为一个 struct T 中的数据分配足够的空间。不多也不少。无需检查。如果“系统内存”,即堆不足以允许保留那么多内存 malloc 将返回 NULL,应该检查。
  • 是的 malloc 和 @PeterSchneider 我的代码开始变得越来越慢所以我想知道是不是因为我的堆上的结构太长了?
  • 当然,如果您分配 GBytes 的数据,您可能会看到您的机器开始将未使用的内存交换到磁盘,以便为分配释放 RAM。但这必须是大量的分配。当不再需要内存时,最好释放()内存。

标签: c memory struct


【解决方案1】:

如果您只是使用简单的struct,那么随着时间的推移,您不需要为它分配更多内存。您只需创建struct,使用它,并在需要时清理它。如果您正在动态分配您的结构(即:使用malloc),那么您测试您创建的指向结构的指针的值并查看它是否为NULL。如果是NULL,则内存分配失败,您可以重试,也可以放弃进一步的操作(即:出错时退出)。

#include <stdio.h>

typedef struct myStruct {
  int i;
  char c;
} myStruct;

int main(void) {
  // Static allocation, no cleanup required
  myStruct staticStruct;
  staticStruct.i = 0;
  staticStruct.c = 'c';

  // Dynamic allocation, requires cleanup
  myStruct* dynamicStruct;
  dynamicStruct = malloc(sizeof(myStruct));
  if (dynamicStruct == NULL) {
    printf("Memory allocation error!\n");
    return (-1);
  } else {
    printf("Successfully allocated memory!\n");
  }

  dynamicStruct->i = 1;
  dynamicStruct->c = 'd';
  free(dynamicStruct);  // Release allocated memory
  dynamicStruct = NULL; // Somewhat common practise, though not 100% necessary
  return 0;
}

现在,如果您需要创建一个动态分配的结构数组,并且您已经用完了它们,并且需要更多,您最好使用稍微复杂一点的方法,例如动态分配的链表的结构。一个很好的例子可以在下面的“参考”部分找到。此外,我还提供了一个链接,指向我在 C 中的内存分配上回答的一个相关问题。它有一些很好的示例,可能也有助于您理清这个主题。

参考文献


  1. 用示例 C 程序解释 C 链表数据结构,访问时间:2014 年 3 月 25 日,&lt;http://www.thegeekstuff.com/2012/08/c-linked-list-example/&gt;
  2. 声明字符串和分配字符串的区别,访问时间:2014-03-25,&lt;https://stackoverflow.com/questions/16021454/difference-between-declared-string-and-allocated-string&gt;

【讨论】:

  • 严格来说,您标记为// Static allocation, no cleanup required 的行有点误导,因为 static 在 C 中具有这些特殊含义,但这些都不适用于这里。 staticStruct 不是静态的,而是自动的
  • @Dogbert 假设您需要在您的程序周围传递分配的结构,以供至少 5 个函数使用
  • @user2861799 有多少功能需要使用它并不重要。当您传递结构本身或指向结构的指针时,首选后一种方法,无论如何都会为您提供参数的副本(即:通过值传递而不是通过引用传递)。如果你有一些你愿意传递的示例代码,我可以进一步评论。
  • @Dogbert 澄清一下:当你传递一个指针时,你传递一个参数的副本,即指针。你不要传递结构的副本。
  • @PeterSchneider 通过“静态”我指的是变量存储在堆栈而不是堆的代码段中。不是 100% 准确,但足以解决手头的问题。我另外引用了我的另一篇文章,该文章非常彻底地解释了这一点。
猜你喜欢
  • 1970-01-01
  • 2021-05-12
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
相关资源
最近更新 更多