2012-04-08 27 views
-1

私は文字列の最初のnn <= strlen(src))文字を返す関数を書いています。なぜこのコードはセグメンテーションフォルトを引き起こしますか?

char* substring(char *src, int n) 
{ 
    char *substr; 
    int i; 
    for (i = 0; i < n; i++) 
    *substr++ = *src++; 
    src = src - n; 
    *substr = '\0'; 
    return substr - n; 
} 

この関数は、1回だけ呼び出されたときに正しい答えを返しますが、2回以上呼び出されたときにSegフォルトを返します。

答えて

5

substrにメモリが割り当てられていないため、関数は初期化されていないポインタを破棄し、メモリに書き込んで、の未定義の動作になります。それが最初に機能するという事実は完全なチャンスです。

substrのメモリを割り当て:substring()の呼び出し側は、返されたバッファをfree()しなければならない

char* substr = malloc(n + 1); /* Plus one for null teminator. */ 

注こと。

0

サブストリング関数でchar * substrのメモリーを割り当てる必要があります。 segfaultsを引き起こしている瞬間にあなたはメモリを壊しています。単純です: char * substr =(char *)malloc(sizeof(char)* n + 1); はこのトリックを行う必要があります。

関連する問題