我在以非常基本的方式实现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,temp指针和这种性质的东西都是调试的,而不是预期功能的一部分。让我感到困惑的是realloc(ret, newsize);
或ret[i] = booking[i]
基本上我确定预订包含一个以NULL结尾的结构表,并且我试图将具有特定值设置为1(付费)的结构表带到新表上,这就是我的主要内容()试图从这个函数中获取......那么我哪里出错?
答案 0 :(得分:2)
我认为这里的问题是你的sizeof(ptr)
只返回指针的大小,这取决于你的架构(你说4,这意味着你正在运行一个32位系统)。
如果动态分配内存,则必须自己跟踪其大小。
答案 1 :(得分:0)
因为sizeof(ptr)
返回指针的大小,而不是分配的大小
答案 2 :(得分:0)
是的,sizeof(ptr)是一个常数。正如另一个答案所说,取决于架构。在32位架构上它将是4,在64位架构上它将是8.如果您需要更多帮助来解决这个问题,那么这个homework help网站对您来说非常棒。
祝你好运。