0

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

我正在尝试扩展 **ret 处的内存区域,它指向一个结构数组,其中包含ret = realloc(ret, newsize);并基于我的调试字符串我知道newsize 在循环过程中正确增加(从原始大小 4到 8 到 12 等),但是当我这样做时,sizeof(ptr)它仍然返回原始大小 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]

基本上我确定预订包含一个以NULL结尾的结构表,并且我试图将具有特定值设置为1(付费)的结构带到新表中,这就是我的main()是试图从这个函数中获取......那么我哪里出错了?

4

3 回答 3

2

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

如果动态分配内存,则必须自己跟踪其大小。

于 2012-06-24T16:48:22.037 回答
0

是的,sizeof(ptr) 是一个常数。正如另一个答案所说,取决于架构。在 32 位架构上为 4,在 64 位架构上为 8。如果您需要更多帮助来解决此类问题,这个家庭作业帮助网站对您来说非常有用。

祝你好运。

于 2012-06-25T08:16:26.627 回答
0

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

于 2012-06-24T16:48:36.087 回答