-3
int get_max_horizantal()
{
    char str[2];
    char strb[2]; //Everything works well unless I put this
    extern char shit[1200];
    int x,number;
    while((3*x+1)<1200)
    {
        if(number%17==0 && number!=0)
        {
            x+=2;
            number=-1;
        }
        str[0]=shit[3*x];
        str[1]=shit[3*x+1];
        int val1=atoi(str);
        printf("%d\n",val1);
        x++;
        number++;
    }
}

わかりましたので、これは私がまったく得られないものです...関数全体はうまく機能しますが、この char strb[2]; を置くと。printf は何も出力せず、コンパイル エラーや警告もありません...今回は本当に助けが必要です...よろしくお願いします。

4

3 に答える 3

3

char 配列で使用する場合atoiは、末尾にヌル ターミネータを配置する必要があります。動作を変更するスタックに何かを追加することは、多くの場合、メモリの終わりから離れたことを意味します。str を大きくし、最後に null を追加します。

char str[3];
str[2] = 0;
于 2013-07-08T11:46:06.650 に答える
3

atoi適切な文字列が必要です。nul で終了していないため、渡すものは適切な文字列ではありません。これは未定義の動作につながり、あなたの場合、物事が機能するか機能しないかの一見無関係な変更として現れます。

于 2013-07-08T11:46:12.480 に答える
2

atoi(3)関数は、null で終了する文字列を期待します。これは、0 バイトを含む の配列です(char慣習的に文字列を終了します)。

最後のバイトstrを使用するか明示的にクリアして、埋める前に少なくとも 3 文字を指定してゼロにする必要があります。memset

char str[3];
/* possible alternative:
   memset (str, 0, sizeof(str)); // the compiler will optimize that...
*/
str[0] = shit[3*x];
str[1] = shit[3*x+1];
str[2] = (char)0;

コンパイル時にすべての警告とデバッグ情報を有効にする習慣を身につけgcc -Wall -gて (Linux でのコンパイルなど)、デバッガーの使用方法を学んでください( gdbLinux で)。

あなたのコンパイラは初期化されていないことを警告できると確信しています。それxnumber修正する必要があります。

int x=0, number=0;

経験則として、コンパイラが警告を出さなくなるまでソースコードを改善してください (すべての警告が eg によって要求され、場合によってはを使用して-Wallいる場合でも)。次に、デバッガーを使用してコードをデバッグします。Linux では、、 、 、 、またはのコマンドが使い慣れているはずです。-Wextragccpprintsstepddisplaybtbacktracegdb


snprintf(3)の使用を検討してください(ただし、 deprecated および unsafe は使用しないでくださいsprintf)。


未定義の動作について学びます。あなたのプログラムはたまたま動いているように見えますが (運が悪かったため)、バグがあります。

于 2013-07-08T11:48:17.583 に答える