【问题标题】:Realloc not expanding my arrayRealloc 没有扩展我的数组
【发布时间】:2012-06-24 16:43:25
【问题描述】:

我在以非常基本的方式实现 realloc 时遇到了麻烦。

我正在尝试扩展 **ret 处的内存区域,它指向一个结构数组 使用ret = realloc(ret, newsize); 并根据我的调试字符串,我知道 newsize 在循环过程中正确增加(从原始大小4 到8 到12 等),但是当我这样做时@ 987654323@ 它仍然返回原始大小 4,并且找不到我试图放入新分配空间的东西(我想我已经将它缩小到 realloc() 这就是我正在格式化的原因像这样的问题)

如果问题对你来说不是很明显,我可以完整地发布函数,我只是尽量不要在我的作业上“作弊”(无论如何,代码现在有点乱,很重使用 printf() 进行调试)。

[编辑] 好的,所以根据你的回答,我在调试代码时失败了,所以我想我会发布整个函数,这样你就可以告诉我更多关于我做错了什么的信息。

(您可以忽略 printf(),因为其中大部分是调试,甚至无法正常工作)

 Booking **bookingSelectPaid(Booking **booking)  {
     Booking **ret = malloc(sizeof(Booking*));
     printf("Initial address of ret = %p\n", ret);
     size_t i = 0;
     int numOfPaid = 0;
     while (booking[i] != NULL)
     {
         if (booking[i]->paid == 1)
         {
             printf("Paying customer! sizeof(Booking*) = %d\n", (int)sizeof(Booking*));
             ++numOfPaid;
             size_t newsize = sizeof(Booking*) * (numOfPaid + 1);
             printf("Newsize = %d\n", (int)newsize);
             Booking **temp = realloc(NULL, (size_t)newsize);
             if (temp != NULL)
                 printf("Expansion success! => %p sizeof(new pointer) = %d ret = %p\n", temp, (int)sizeof(temp), ret);
             ret = realloc(ret, newsize);
             ret[i] = booking[i];
             ret[i+1] = NULL;
         }
         ++i;
         printf("Sizeof(ret) = %d numOfPaid = %d\n", (int)sizeof(ret), numOfPaid);
     }
     return ret; }

[EDIT2] --> http://pastebin.com/xjzUBmPg

[EDIT3] 为了清楚起见,printf、临时指针和这种性质的东西是调试的,而不是预期功能的一部分。让我感到困惑的是realloc(ret, newsize);ret[i] = booking[i] 的那一行

基本上,我确定 booking 包含一个以 NULL 结尾的结构表,我正在尝试将特定值设置为 1(付费)的结构表带到新表中,这是我的主要内容() 正试图从这个函数中获取......那么我哪里出错了?

【问题讨论】:

  • 这里的问题到底是什么? (我在任何地方都没有看到问号......)
  • 我想问题是:“我做错了什么?”基本上,我已经分配了 '*ptr = malloc(sizeof(my_structure))' 而不知道我的数组中有多少结构实例,然后基于循环,我正在递增一个大小变量并在 'ptr = realloc(ptr, newsize)' 中使用它,但我无法将更多结构放入数组中......我可以发布整个代码,即使我有课程失败的风险,如果我太模棱两可了,哈哈。
  • @user1478361 :下次,使用“代码示例”代替“块引用”(在编辑工具栏中)。我现在为你修好了。

标签: expand realloc


【解决方案1】:

我认为这里的问题是您的 sizeof(ptr) 仅返回指针的大小,这取决于您的架构(您说 4,这意味着您正在运行 32 位系统)。

如果你动态分配内存,你必须自己跟踪它的大小。

【讨论】:

  • 我已经更新了我的初始帖子以包含问题区域中的代码。 (而且由于我不明白如何将控制字符带到 stackoverflow 上,所以我也将其发布在 pastebin 上)Edit 嗯...现在它突然正确格式化了 - 哦,好吧,你不要我猜现在不需要看 pastebin
  • 看起来你的i 可能会比numOfPaid 大,这意味着ret[i]ret[i+1] 可能会跑过来。
  • 即使main提供的表只有4个条目,包括NULL指针? (如果可以提供更多洞察力,我可以在控制台中发布标准输出打印的屏幕截图——即使我的调试部分错误)
  • 好吧..我只是尝试将 malloc() 直接修改为 4 * sizeof(Booking*) ,即使这样它打印的内容也不会超过第一个条目,所以很明显它不会出错,我认为它是......我想这意味着我把整个问题的标题都写错了
  • 所以这里是没有调试废话的函数:pastebin.com/SACkET8M 这是 main() 调用它:pastebin.com/sfcBCTWT
【解决方案2】:

因为sizeof(ptr)返回的是指针的大小,而不是分配的大小

【讨论】:

    【解决方案3】:

    是的,sizeof(ptr) 是一个常数。正如另一个答案所说,取决于架构。在 32 位架构上它将是 4,而在 64 位架构上它将是 8。如果您需要更多关于此类问题的帮助,这个homework help 网站可能非常适合您。

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2013-02-11
      • 2013-06-11
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2022-11-04
      • 1970-01-01
      相关资源
      最近更新 更多