2012-06-24 66 views
0

我很難以非常基本的方式實現realloc。Realloc不擴展我的陣列

我想在** RET,這是指向結構 與ret = realloc(ret, 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的,臨時指針和那種性質的東西都是調試的,而不是預期功能的一部分。那我百思不得其解的行是我知道肯定預訂包含在NULL結束結構的表中的一個與realloc(ret, newsize);ret[i] = booking[i]

基本上,我試圖把具有特定值集的那些到1(支付)到新表,這是我的主要()試圖從這個功能獲得...所以我錯了哪裏?

+0

這裏的問題究竟是什麼? (我沒有在任何地方看到問號......) –

+0

我想問題是:「我做錯了什麼?」 基本上,我已經分配'** ptr = malloc(sizeof(my_structure *))' 而不知道該數組中有多少個結構實例,然後基於一個循環,我正在增加一個尺寸變量,並在'ptr = realloc(ptr,newsize)'中使用它,但我無法再將更多結構放入數組中... 即使冒着失敗課程的風險,我也可以發佈整個代碼,如果我太模糊了,哈哈。 – user1478361

+0

@ user1478361:下一次,請使用'代碼示例'代替'blockquote'(它位於編輯工具欄中)。我現在爲你修復它。 – Tim

回答

2

我認爲這裏的問題是,你的sizeof(ptr)只返回指針的大小,這取決於你的體系結構(你說4,所以這意味着你正在運行一個32位系統)。

如果您動態分配內存,您必須自己跟蹤其大小。

+0

我已經更新了我的初始文章,以包括來自問題區域的代碼。 (因爲我不知道如何將控制字符帶到我的計算器上,所以我把它貼在了pastebin上) [編輯]嗯......現在它的格式突然好了 - 哦,你現在不需要看pastebin我想 – user1478361

+0

看起來你的'i'可能比'numOfPaid'更大,這意味着'ret [i]'和'ret [i + 1]'可能會結束。 –

+0

即使當main提供的表只有4個條目時,包括NULL指針? (我可以在控制檯上發佈stdout打印的screencap,如果這樣可以提供更多的信息 - 即使我的調試部分是錯誤的) – user1478361

0

由於指針的sizeof(ptr)返回尺寸,而不是分配的大小

0

是的,的sizeof(PTR)是一個常數。正如另一個答案所說,取決於體系結構。在32位體系結構中,它將是4,而在64位體系結構中它將是8.如果您需要更多幫助來解決這樣的問題,那麼這個homework help網站可能對您很好。

祝你好運。