2015-10-13 16 views
-1
#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    int *p=(int*)malloc(10*4); 
    int i,a,count=1; 
    printf("Input :\n"); 
    for(i=0;i<10*count;i++) 
    { 
    scanf("%d",p+i); 
    if(*(p+i)==22){ 
     break; 
     } 
    if(i==9+(count-1)*10){ 
      realloc(p,(10+10*count)*sizeof(int)); 
      count++; 
     } 
    } 
    printf("\nOutput :\n"); 
    i=0; 
    for(;;){ 
     if(*(p+i)==22){ 
      break; 
     } 
     printf("%d\n",*(p+i)); 
     i++; 
    } 
} 

的mooto的代碼是採取汽車無直到22遇到的輸入,並且當遇到22然後它打印我已經進入precedding它 SPOJ的所有值上運行Ideone.com代碼在gcc編譯器上正常工作,但是當我將它提交給編碼門戶(SPOJ)時,它顯示運行時錯誤,爲什麼?

+1

你可能想告訴我們*你得到了什麼*錯誤。 –

+0

*** ./prog中的錯誤:realloc():無效的舊尺寸:0x09654008 *** @BoPersson –

+1

如果用戶輸入的數字超過3位數,會發生什麼情況?此外,你將覆蓋你的緩衝區。假設每次輸入兩位數字,首先讀取p [0]和p [1],第二次讀取p [1]和p [2]等。雖然修復爲amyCU表示,但您的代碼沒有太大意義。也請格式化,以便可讀。 – digger

回答

0

代碼上帝,我很慢。

*** Error in `./prog': realloc(): invalid old size: 0x09654008 *** 

這裏是最有可能的問題是什麼:

  1. 第一malloc電話後,p設置爲某個堆地址(姑且稱之爲0x1000);
  2. 第一realloc不能調整緩衝器在其當前的位置,所以它分配在不同的地址(稱之爲0x2000)一個緩衝液和標記緩衝器開始於0x1000爲可用於使用;
  3. 你不更新p指向這個新的緩衝區;
  4. Something覆蓋從0x1000開始的內存,破壞關於緩衝區大小存儲的任何元數據;
  5. 您再次調用realloc,但由於p仍然是0x1000,realloc試圖調整先前釋放的緩衝區的大小,該緩衝區已被覆蓋;
  6. 無論您的malloc實現使用的元數據是否已被舊覆蓋覆蓋,因此都是錯誤。

您需要保存從realloc返回的值,因爲它可能是從p可能不同(包括NULL如果請求不能滿足):

int *tmp = realloc(p, sizeof *p * (10 + 10 * count)); 
if (tmp) 
    p = tmp; 
else 
    // realloc failed, handle as appropriate 

你必須確保ptmp是相同的類型。

另外,你最初的malloc電話更改爲

int *p = malloc(sizeof *p * 10); 

鑄造的mallocrealloc結果不鼓勵使用C ,並且sizeof *p給出了相同的結果sizeof (int),用的,如果你額外的好處永遠改變p(從int *long *)的類型,您不必將參數更改爲mallocrealloc - sizeof *p將始終爲您提供正確的答案。


1.是的,C++必須轉換的malloc的結果,但如果你在寫C++,你就不會首先使用malloc(這個練習,你只需用std::vector<int>它可以根據需要增長)。

相關問題