2016-05-26 8 views
-1
#include <stdio.h> 
#include "../library/string.c" 

int test(char* left, char* right) { 
    while (*left != '\0') { 
     printf("%p\t%d, %d\n", left, (*left) + 1, *left); 
     left++; 
    } 
    return 0; 
} 

int main() { 
    char* a = "hello,kittz"; 
    char* b = "hello,kitty"; 
    test(a, b); 
    return 0; 
} 

私は上記のコードを実行し、出力されない:はなぜここにこの原因セグメンテーションフォールト

0x40073f 105, 104 
0x400740 102, 101 
0x400741 109, 108 
0x400742 109, 108 
0x400743 112, 111 
0x400744 45, 44 
0x400745 108, 107 
0x400746 106, 105 
0x400747 117, 116 
0x400748 117, 116 
0x400749 123, 122 

しかし、私は、なるようにコードを変更:

int test(char* left, char* right) { 
    while (*left != '\0') { 
     printf("%p\t%d, %d\n", left, (*left)++, *left); 
     left++; 
    } 
    return 0; 
} 

出力を伝えます私は何かが間違っていることがある。出力は次のとおりです。 セグメンテーションフォルト(コアダンプ)。コンパイル時に「L」にリテラル「K」を変更しようとしている。すなわち -

+3

のようにポインタを使用することができますし、あなたのセグメンテーションフォルトがあなたのようなのIntを使用することができ、文字列にナビゲート

を発生するラインを表示することができますそれを掲示する前に。答えを得るチャンスが増えます。 – legends2k

+1

あなたは 'gdb'とセグメンテーション違反が起こっている場所を特定するために、あなたのコードのステップにこれを落とし、デバッグフラグ(' -g'を使用して)でこれをコンパイルしようとしたことがありますか? – Jules

+2

これらの '**'は実際のコードではないハイライトであると想定しています。あなたはそれらを取り出して、実行中の実際のコードを表示できます – pm100

答えて

4
(*left)++ 

は、leftポイントという値を変更しようとしています。これは、(厳密にはその「未定義の動作」を話す - これは、それは時々、いくつかのシステム上で動作する可能性がある、またはそれはあなたのハードドライブをフォーマット、またはホワイトハウスの芝生の上のクリスマスツリーを点灯可能性を意味します...)許可されていません

+0

-1 - これは、合理的なコンパイラで汎用コンピュータ上でCで行うのは、実際にはかなり良いことです。文字列リテラルが読み取り専用メモリに置かれていると問題が発生する可能性があります。 – lowtech

+1

Upvoted。正解。 @lowtech文字列リテラルを変更することは、Cでの定義されていない動作です。あなたが話しているものを厳密に話したい場合は、 – 2501

+0

を指定してください。これは、この質問に使用されているタグで、https://stackoverflow.com/tags/c/info: – lowtech

0

segfaultを見つけるために、多くのツールを使用できます。

まずいつか役立つかもしれないgcc -Wall -Wextra -Werrorフラグでコンパイルします。

また、あなたはGDBを使用して助けるため-gフラグを追加する@Julesが言うように使用することができます。そして、あなたのGDB環境におけるset env MallocStackLogging 1本当に便利です!あなたのコードをフォーマットしてください

int i = 0; 
char str[] = "hello world"; 

while (str[i]) 
    putchar(str[i++]); 

しかし、あなたはまた、

while (*str) 
    *str++; 
+0

あなたの提案に感謝します。これは私が最近Cプログラムを習得して以来、私にとって有益です。 – Saint

関連する問題