-1

言語: C

グローバル変数

char array[1001]={0};
char result[1001]={0};

//main()

//lasta - index of last element in array[], lastr - index for result[]
//larr - pointer to larger array (array[] or result[])
//bint - pointer to bigger of lasta or lastr, sint - smaller

int i = 0, lasta = 0, lastr = 0, overflow = 0;
char *larr, *sarr;
int *bint, *sint;
scanf("%s", array); //init arrays - ok
scanf("%s", result);

//some routines, include output of arrays, whitch don't modify global arrays
//...

// next 3 lines is just debug output. No troubles, all correct
printf("\narray:  %s\n", array);
printf("\nresult: %s\n", result);
printf("\nlasta = %d, lastr = %d, arr[lasta]=%d, res[lastr]=%d\n", lasta, lastr, array[lasta], array[lastr]);

if (lasta > lastr)
{
    larr = array;
    sarr = result;
    bint = &lasta;
    sint = &lastr;
}
else
{
    larr = result;
    sarr = array;
    bint = &lastr;
    sint = &lasta;
}
putc('5', stdout); // no ouput: Segmentation fault (core dumped)

そのような方法で if-else ブロックを変更すると:

    larr = array;
    putc('5', stdout);
    sarr = result;
    putc('5', stdout);
    bint = &lasta;
    putc('5', stdout);
    sint = &lastr;
    putc('5', stdout);

「セグメンテーション違反」はありません。もっと

ポインターの何が問題になっていますか?

ps システム: FreeBSD 9.1、コンパイラ: gcc 4.6、gcc 4.9、clang

問題が見つかりました: 私のばか。main() の最後にポインタ bint/sint (*bint -= 1 の代わりに *bint-- を使用) を使用すると正しく動作しません。fflush(stdout) の呼び出しがなかったため、putc(..) は何も出力しませんでした。

4

1 に答える 1