• 締切済み

正しくないのに実行できてしまう理由

配列の動的確保でこのような配列の確保はよくないと聞いたんですが 警告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; }

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> >cygwinは可変長配列がサポートされているんですか。 > cygwinはというよりはC99で規格化されました。 元々、可変長配列はGCCの独自拡張機能でした。ですので、CygwinのGCCで-std=c99オプションを付けるなどしてC99に対応させなくても、使用することが可能です。 C99の可変長引数は、GCCの拡張機能を標準規格にフィードバックしたものです。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

>cygwinは可変長配列がサポートされているんですか。 cygwinはというよりはC99で規格化されました。 C99規格未対応のコンパイラや、 VCなどの標準規格外のコンパイラでは恐らく通りません

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> 今回使ったコンパイラはcygwinです。 Cygwinの場合、GCCのバージョンやコンパイルオプションにもよりますが、可変長配列がサポートされていますので、この書き方で問題ありません。 また、C99でもこの書き方が可能になっています。 Cygwinでも、-pedanticオプションを付け(て、かつ-std=c99や-std=gnu99といったオプションを指定しなかっ)た場合には、警告が出ます。

参考URL:
http://www.sra.co.jp/wingnut/gcc/gcc-j.html#Variable%20Length
JIF0131
質問者

お礼

cygwinは可変長配列がサポートされているんですか。 初めて知りましたありがとうございます。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

このソースは省略されていませんか? 省略されていないとすると、printfやscanfのような可変個引数を使う関数を、関数原型なしで呼び出した場合の動作は未定義です。 それ以上のことは処理系に依存しますので、何を使っているのか補足してください。

JIF0131
質問者

補足

今回使ったコンパイラは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; }

関連するQ&A