2014-10-12 58 views
-2

爲我的項目之一,我必須做一個新版本的函數insertString,你可以看到下面的代碼:錯誤來自哪裏? Valgrind/C/insertString

這個函數總是給我想要的結果,(我做了一些單元測試),但是主要的問題是這樣的:即使它在我的IDE(彙編等)中工作,它也不會通過使用Valgrind的單元測試,有沒有人可以看到錯誤?

char * insertString(const char * src, int insertPosition, const char * toBeInserted,int insertLength) 
{ 
    size_t outputSize=stringLength(src)+(size_t)insertLength; 
    char* output=malloc(sizeof(char)*(outputSize+1)); 
    int i; 

    if(output==NULL) 
    { 
     fatalError("error during memory allocation in InsertString"); 
    } 

    for(i=0;i<insertPosition;i++) 
    { 
     output[i]=src[i]; 
    } 
    for(i=0;i<insertLength;i++) 
    { 
     output[i+insertPosition]=toBeInserted[i]; 
    } 
    for(i=0;i<=insertLength;i++) 
    { 
     output[i+insertPosition+insertLength]=src[insertPosition+i]; 
    } 

    output[outputSize]='\0'; 
    return output; 

} 

謝謝你的一切,並有一個良好的星期天!

+2

*你得到了什麼*錯誤? – 2014-10-12 10:03:31

+0

你確定例如'i + insertPosition + insertLength'小於'outputSize'嗎?或者'insertPosition + i'小於'src'的大小? – 2014-10-12 10:05:57

+0

另外,上一個循環中的循環條件看起來很可疑。 – 2014-10-12 10:08:18

回答

0

終止條件,i<=insertLength,在您的最後一個循環:

for(i=0;i<=insertLength;i++) 
{ 
    output[i+insertPosition+insertLength]=src[insertPosition+i]; 
} 

無關剩餘的src長度。如果insertLength足夠大,代碼將會讀取到src的末尾。

它更改爲類似(我認爲):

for(i=0;i<=strlen(src)-insertPosition;i++) 
{ 
    output[i+insertPosition+insertLength]=src[insertPosition+i]; 
} 

而且,在我看來,代碼可以作出更容易通過使用運行指數爲output緩衝區,而不是理解(因此可驗證)將其重置爲每個循環的0併爲下標添加其他值。另外,我認爲使用遍歷各種緩衝區的指針會更具可讀性:

char* tmp = output; 

for(i=0;i<insertPosition;i++) 
{ 
    *tmp++ = *src++; 
} 
for(i=0;i<insertLength;i++) 
{ 
    *tmp++ = *toBeInserted++; 
} 
for(i=insertPosition;i<=strlen(src);i++) 
{ 
    *tmp++ = *src++; 
} 

*tmp++ = '\0'; 
+0

我試過,它的工作原理,我甚至不知道爲什麼我把這個條件放在那裏......但是我花了一個小時而沒有找到它......謝謝:) – SpockFR 2014-10-12 10:27:56