- 締切済み
正しくないのに実行できてしまう理由
配列の動的確保でこのような配列の確保はよくないと聞いたんですが 警告1つなしにコンパイルが通って実行できてしまいます。 このようなソースは本当によくないのでしょうか? また引き起こすような問題等はあるのでしょうか? int main(void) { int x, i , j; scanf("%d",&x); //xの大きさを入力 int cell[x][x]; for(i=0;i<x;i++) { for(j=0;j<x;j++) { printf("cell[%d][%d]入力>\n",i,j); scanf("%d",&cell[i][j]); } } for(i=0;i<x;i++) { for(j=0;j<x;j++) { printf("cell[%d][%d]=%d\n",i,j,cell[i][j]); } } return 0; }
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- jacta
- ベストアンサー率26% (845/3158)
> >cygwinは可変長配列がサポートされているんですか。 > cygwinはというよりはC99で規格化されました。 元々、可変長配列はGCCの独自拡張機能でした。ですので、CygwinのGCCで-std=c99オプションを付けるなどしてC99に対応させなくても、使用することが可能です。 C99の可変長引数は、GCCの拡張機能を標準規格にフィードバックしたものです。
- aris-wiz
- ベストアンサー率38% (96/252)
>cygwinは可変長配列がサポートされているんですか。 cygwinはというよりはC99で規格化されました。 C99規格未対応のコンパイラや、 VCなどの標準規格外のコンパイラでは恐らく通りません
- jacta
- ベストアンサー率26% (845/3158)
> 今回使ったコンパイラはcygwinです。 Cygwinの場合、GCCのバージョンやコンパイルオプションにもよりますが、可変長配列がサポートされていますので、この書き方で問題ありません。 また、C99でもこの書き方が可能になっています。 Cygwinでも、-pedanticオプションを付け(て、かつ-std=c99や-std=gnu99といったオプションを指定しなかっ)た場合には、警告が出ます。
- jacta
- ベストアンサー率26% (845/3158)
このソースは省略されていませんか? 省略されていないとすると、printfやscanfのような可変個引数を使う関数を、関数原型なしで呼び出した場合の動作は未定義です。 それ以上のことは処理系に依存しますので、何を使っているのか補足してください。
補足
今回使ったコンパイラはcygwinです。 #include <stdio.h> int main(void) { int x, i , j; scanf("%d",&x); //xの大きさを入力 int cell[x][x]; for(i=0;i<x;i++) { for(j=0;j<x;j++) { printf("cell[%d][%d]入力>\n",i,j); scanf("%d",&cell[i][j]); } } for(i=0;i<x;i++) { for(j=0;j<x;j++) { printf("cell[%d][%d]=%d\n",i,j,cell[i][j]); } } return 0; }
お礼
cygwinは可変長配列がサポートされているんですか。 初めて知りましたありがとうございます。