[2375] Re:ポインタ完全制覇の質問
投稿者:sasaki
2024/05/16 09:30:26
ご回答いただきありがとうございます。
>初期化とは関係なく、配列にはサイズが必要です。
>サイズを入れない空の[]が書ける場所は、「ポインタ完全制覇」なら「3-5-3 空の[]について」で
>説明している以下の箇所です。
>
>1.関数の仮引数の宣言
>2.初期化子により配列のサイズが確定できる場合
>3.グローバル変数をextern宣言する場合
>
>ここで、1はポインタに読みかえられるのでそもそも配列ではなく、
>2と3は、初期化子でサイズがわかったり、別のコンパイル単位にサイズが書いてあることが
>期待できる、という理由で空の[]が書けます。
>extern宣言ではないグローバル変数の定義で、初期化子も書かなければ、
>やはりサイズは必要です。
>関数外に、単に
>
>int a[];
>
>と書いて、仮にコンパイルが通ったとして、この配列の要素数はいくつであるのが適当でしょうか?
>「少なくとも一つは0が代入され、int a[] = {0};と同義」になったとしても、
>別に便利でもないのではないでしょうか。
確かにおっしゃる通りです。
配列とポインタを混同して勝手におかしな解釈をしていることに気づきました。
ご指摘いただきありがとうございます。
「3-5-3 空の[]について」、「3-6 配列とポインタは別物だ!!」を肝に銘じておきます。
>>②①のあとに、グローバル変数であることが重要なのではなく静的変数であることが重要なのではと考え、
>> 試しにstatic int a[];としたら、これはコンパイルが成功しました。
>
>これは普通にコンパイルが通らないのでは、と思います。
>
>私がgcc 9.4.0で試したところ、
>関数外にstatic int a[];と書いたら以下のエラーが出ました。
>
>test.c:3:12: warning: array ‘a’ assumed to have one element
> 3 | static int a[];
>
>関数内だと以下です。いずれにしてもエラーです。
>
>test.c:6:16: error: storage size of ‘a’ isn’t known
> 6 | static int a[];
>
>sasakiさんの環境でエラーにならないようでしたら、環境(OS, コンパイラ、コンパイラのバージョン)を
>教えてください。また、ソースをまるごとここに貼ってください。
下記の通りです。
【環境】
OS : Windows10 Enterprise (ver 22H2)
コンパイラ: gcc 6.3.0
【ソースコード】
#include <stdio.h>
static int a[];
int main()
{
return 0;
}