1

C で string_reverse の簡単な実装をいくつか実行しようとしています。ただし、gdb でデバッグすると、次のエラーが発生します。

Program received signal SIGSEGV, Segmentation fault.
0x00000000004005ca in string_reverse1 (string=0x68 <Address 0x68 out of bounds>)
28          length = strlen(*string);
Missing separate debuginfos, use: debuginfo-install glibc-2.15-58.fc17.x86_64

これが私が得ているエラーの私のコードです(エラーが発生した行にコメントしました):

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char *char1 = "hello";
    char *char2 = "hi";
    char *char3 = "this is a really long string!";

    string_reverse1(*char1);
    string_reverse1(*char2);
    string_reverse1(*char3);
    printf("%s, %s, %s\n", char1, char2, char3);

    return 0;
}

//Assuming method's purpose is to reverse the passed string
//and set the original string equal to the reversed one
void string_reverse1(char *string) 
{
    //Calculate length once so it isn't recalculated at
    //every iteration of the for loop
    int length;
    char *reversed;
    int i;
    int reversed_counter;
    length = strlen(*string); //ERROR
    reversed_counter = 0;
    for(i = length - 1; i >= 0; i--) {
        reversed[reversed_counter] = string[i];
        reversed_counter++;
    }
    //Can't forget to add the terminating null character!
    reversed[length] = '\0';
    string = reversed;
}

strlen は、ヌル バイトである \0 に到達するまで文字列を進めて、渡された文字列の長さを返すことを知っています。それで、渡された文字列が何らかの形で null で終わっていないのではないかと思いますか? ただし、メインで文字列を誤って宣言したとは思いません。

洞察をありがとう。

4

3 に答える 3

1

問題はあなたが電話するときですstring_reverse1

string_reverse1(*char1);

*beforeは、文字列の最初の文字の値を返すchar1逆参照を行います。char1合格したい場合は、*charを省略してください*。これは、のタイプchar1がすでにであるためchar *です。変更する必要はありません。

間接参照char1すると、最初の文字「h」の実際のASCII値が送信されます。次にstrlen、アドレス'h'のメモリにアクセスしようとしていますが、これは任意のメモリ位置であるため、segfaultingです。

于 2013-01-28T03:02:34.493 に答える
0

それ以外の...

string_reverse1(*char1);

...これを行う:

string_reverse1(char1);

文字列定義は既にポインターであるため、それを渡す必要があります。それらを逆参照すると、まったくメモリ アドレスではない値が得られます。

于 2013-01-28T03:04:22.260 に答える
0

宣言 void string_reverse1(char *string) によると、

  length = strlen(*string); //ERROR

に変更する必要があります

   length = strlen(string); 

メインプログラムは関数を次のように呼び出す必要があります

string_reverse1(char1);
string_reverse1(char2);
string_reverse1(char3);

次に、エラーがあります

逆[逆カウンター] = 文字列[i];

キャラクターにスペースを割り当てていないためです (通常、セグメンテーション フォールトは、割り当てられていないメモリへのアクセスが原因で発生します。

これを修正する1つの方法は、

char* reversed = (char*) malloc(sizeof(char)*(length+1));

このコードにはまだ問題があります。

string = reversed;

「string」の内容を実際に変更するわけではありません。この問題を解決するために、関数の動作方法を変更できます。より良い方法は、別の配列を使用する代わりに、「string」自体の文字を変更することです。

于 2013-01-28T03:28:51.823 に答える