0

stdinから読み取るものを呼び出すときに、セグメンテーション違反が発生し続けます。理由がわかりません。getchar()特定の関数内からまたは他の同様の関数を呼び出すと、プログラムがクラッシュしますが、別の関数から呼び出すと、正常に動作します。クラッシュする部分は次のとおりです。

int prompt()
{
  int i;
  int selection = -1;
  while (selection < 0 || selection > 9) {
    printf("Item:\n\n");
    for (i = 0 ; i < 10 ; i++) {
      printf("%d) %s\n", i, getItemName(i));
    }

    for (i = 0 ; i < 11 ; i++) {
      printf("\n");
    }

    printf("Select the number of the corresponding item: ");
    char input = getchar(); <--- dies here!
    if (input != EOF && input != '\n') flush();
    selection = atoi(input); <--- error here!
  } 

  return selection;
}

void flush() {
    char c = getchar();
    while (c != EOF && c != '\n')
        c = getchar();
}

更新多くの実験を行った後、問題はマークアウトしたコードにあることがわかりました。(atoi())。char私はそれをではなく単純なものとして渡していましたchar*printfsの束を使用したときに、を呼び出す前ではなく、指定した行で終了する理由がまだわかりませんatoi()

4

1 に答える 1

2

コンパイルしてデバッガーで実行すると、問題は実際にatoi呼び出しにあることがわかります。

char input = ...;
...
selection = atoi(input);

atoiを取るので、アドレス(の)char *の文字列を数値に変換するように指示していますが、これは無効なアドレスです。0x00000030'0'

gdbで:

Select the number of the corresponding item: 0

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000030
0x00007fff8ab00c53 in strtol_l ()
(gdb) bt
#0  0x00007fff8ab00c53 in strtol_l ()
#1  0x0000000100000dc5 in prompt () at test.c:45
#2  0x0000000100000cb9 in main () at test.c:21

警告を付けてコンパイルすると、次のようにもなります。

$ gcc -Wall -std=gnu99 test.c
test.c: In function ‘prompt’:
test.c:48: warning: passing argument 1 of ‘atoi’ makes pointer from integer without a cast
于 2012-08-11T19:31:48.877 に答える