2016-05-12 197 views
-5

//////return語句for循環

char* duplicate(char* string, int count) 
{ 
    char* duped = (char*) malloc(sizeof(char)*(count*strlength(string)+1)); 
    int i=0,j=0,t=0; 
    for(i=0; i<count*strlength(string); i++,j++) 
    { 
     if (j==(strlength(string))) 
     { 
      j=0; 
      t++; 
     } 

     if (t==count) 
     { 
      duped[i] = '\0'; 
      break; 
     } 

     duped[i] = string[j]; 
    } 

    return duped; 
} 

上面的代碼完美地工作,但下面的人給分段錯誤。他們有什麼區別?看到回報時不應該停止功能嗎?

char* duplicate(char* string, int count) 
{ 
    char* duped = (char*) malloc(sizeof(char)*(count*strlength(string)+1)); 
    int i=0,j=0,t=0; 
    for(i=0; i<count*strlength(string); i++,j++) 
    { 
     if (j==(strlength(string))) 
     { 
      j=0; 
      t++; 
     } 

     if (t==count) 
     { 
      duped[i] = '\0'; 
      return duped; 
     } 

     duped[i] = string[j]; 
    } 
} 
+0

[請參閱此討論關於爲什麼不在'C'中投射'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

+3

請修復縮進,希望你的一半問題得到排序,如果不是更多。\ –

+1

什麼是'strlength()'?你爲什麼使用它而不是標準的'strlen()'? –

回答

1

如果什麼string是0長度或count爲0?在你的第二種情況下,你不會返回一個值。

這應該是給一個編譯器警告,並可能會導致崩潰,因爲它返回任何它想要的。


編輯

好了,問題是更深 - 你永遠不會獲得到的是,在設置「\ 0」,與這些初始條件環路(「變焦」的部分代碼和3 )。因此,您的字符串也可能沒有設置終止符,具體取決於malloc的感覺。即使退出for循環,如果有字符串,則需要設置NUL的值。這就是爲什麼第二個失敗,而不是第一個 - 它確實錯過了返回聲明。

+0

情況並非如此。字符串是「縮放」,計數是3. – onur

+0

它引發編譯器警告,並有一個明確的失敗情況,它調用你忽略的UB。也就是說,你還沒有說出哪一行或什麼地方出現了seg-fault。有這將有助於縮小範圍。 –

+0

抱歉給您帶來不便。我太新手了,我在終端看到的所有內容都是「分段錯誤(核心轉儲)」。如果你告訴我我怎麼看到哪條線路導致錯誤,我會非常高興。 – onur