2009-04-06 12 views
2

トレーニング中のハッカーとして、文字列を取り、新しい文字列のメモリを割り当て、新しい文字列へのポインタを返す独自のstring_reverse関数を作成することにしましたが、これがセグメンテーション違反を返すので、私が望むものが得られません。リターンでこのデバッグエラーの解釈方法

#include <stdio.h> 
#include <stdlib.h> 


char* string_reverse(char* string); 

char* string_reverse(char* string) { 
    int len = 0; 
    for (int i = 0; *(string + i) != '\0'; ++i) 
    len++; 

    char* result = (char*)malloc(len * sizeof(char)); 
    if (result == NULL){ 
    puts("Pointer failure"); 
    exit(EXIT_FAILURE); 
    } 

    for (int i = 0; *(string + i) != '\0'; ++i) 
    *(result + (len - i)) = *(string + i); 

    return *result; 
} 

int main() { 
    char* str= "Ni Hao!"; 
    char* result = string_reverse(str); 

    printf("%s\n", result); 
    free(result); 
    return 0; 
} 

、私はこのデバッグメッセージが表示されます。

Starting program: /home/tmo/string_reverse 

Program received signal SIGSEGV, Segmentation fault. 
0xb7e5b3b3 in strlen() from /lib/i686/cmov/libc.so.6 

どのように私はこの結果を解釈すべきか?

+0

コンパイラが警告していることに注意してください。そして、それがあなたに何かを与えていない場合は、より良いコンパイラを入手してください。 GCCは言う: x.c:関数 'string_reverse ': x.c:21:警告:キャストのない整数からポインタを返す –

答えて

10

コードでは、NULLターミネータが反転文字列に追加されませんでした。その結果、printf関数がクラッシュして長さを計算しようとしました。

を変更し、次の

char* result = (char*)malloc((len+1) * sizeof(char)); 

へのmallocラインそして、あなたは、文字列がnullターミネータを持って確保するためにstring_reverse関数の最後に次の行を追加する必要があります。他のコメント

  • はsizeof(チャー)の

    result[len] = '\0'; 
    

    カップルは不要です。文字のサイズはC標準で定義され、いくつかのタイプの一つであり、値は1

  • である第一のループはstrlenをする単純なコールに置き換えることができます

EDIT

その他の2つの問題。実際に文字コピーを行う行は正しくないようです。私はそれが(len - i - 1)であるべきだと信じています。さもなければ、最初の文字の書き込みはヌルターミネータの場所である(result + len)で起こります。

また
*(result + ((len - i) - 1)) = *(string + i); 

は、また、あなたはあなたの結果の文字列へのポインタ出回っているため、関数の最後で結果を逆参照すべきではないリターン

+0

残念ながら、コードからセグメンテーションフォールトエラーが発生しています。 – user80285

4

にない間接参照の結果を行います。

return result; 
関連する問題