C言語にて、使われていない変数を消すとsegmentation faultが生じてしまいます。
動作しているコードは以下になります。
c
1#include <stdio.h> 2 3int main(void) 4{ 5 int i, j; 6 int score; 7 int height; 8 int array[height][5]; 9 10 printf("高さを入力してください\n"); 11 scanf("%d", &height); 12 13 printf("各段の要素をそれぞれ入力してください\n"); 14 for (i = 0; i < height; i++) 15 { 16 scanf("%d%d%d%d%d", &array[i][0], &array[i][1], &array[i][2], &array[i][3], &array[i][4]); 17 } 18 printf("-------\n"); 19 for (i = 0; i < height; i++) 20 { 21 for (j = 0; j < 5; j++) 22 { 23 printf("%d\n", array[i][j]); 24 } 25 } 26 return 0; 27}
% gcc -o test test.c % ./test 高さを入力してください 3 各段の要素をそれぞれ入力してください 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ------- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ここで、使われていない変数scoreを削除すると、
zsh: segmentation fault ./test
となってしまい、手がかりもつかめず解決できずにいます。
初心者質問で恐縮ですが、何卒よろしくお願いします。
バージョン情報
mac: Montrey 12.0.1
% gcc -v Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1 Apple clang version 13.0.0 (clang-1300.0.29.3) Target: x86_64-apple-darwin21.1.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
gcc や clang に疎いのですが、警告やエラーにならずコンパイルできてしまうのですね。。少し驚きました。(「-Wall」を付けると警告が出ることを確認しました。)
ちなみに、VC++ の場合だと、下記のようなエラーが出てコンパイルできませんでした。
-------------------------------------------------------------------------
C:\home\edu\teratail\questions\373261>cl test.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.30.30705 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.c(8): error C2057: 定数式が必要です。
test.c(8): error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。
test.c(8): error C2133: 'array': サイズが不明です。
そのコンパイラが可変長配列をサポートしていればコンパイル可能です。C11以降であれば、可変長配列はオプション(サポートしなくてもよい)になっているので、VC++はサポートしていないのでしょう。
なるほど、、!コンパイラによってその辺りの仕様も異なってくるのは知りませんでした。コメントくださりありがとうございます。
回答2件
あなたの回答
tips
プレビュー