

C2100: 間接指定演算子 (*) の使い方が正しくありません。  
error C2143: 構文エラー: ';' が '}' の前にありません。

[![画像の説明をここに入力](https://i.stack.imgur.com/VygP9.png)](https://i.stack.imgur.com/VygP9.png)


CC BY-SA 4.0
2023-06-26T11:49:19.417
95380
2023-07-01T04:28:25.360
2023-06-27T01:10:30.403
3060
58318
question
c
C言語コードのどこに問題がありますか


# 回答ではないが長文なので回答欄を使います

編集前のコードを最小限の修正をしてコンパイルしたら C2100 にならない、他のエラーが出る気がします・・・

以下の点がわかっていないようで、結果として全面的に誤っています。

  * ポインタと配列の違い
  * `int` １個へのポインタと `int` 配列へのポインタの違い
  * 配列要素のポインタ経由での呼び出し方
  * 自動変数の記憶域期間（寿命）

全部書き直す必要がありそうですが、上記全部を解説すると本が１冊書けちゃいます＝stackoverflow 的にはそんな広範囲すぎる質問は取り扱い範囲外。

一応「回答」という形式を保つなら、全部に問題がありますとなるでしょうか。課題を細分化して文書化できれば（オイラを含めて）回答してくれる人はいっぱいいるでしょう。自分が「何がわかっていないか」を整理してこの質問を編集するなり、この質問はクローズして別途質問を起こすことをお勧めします。


CC BY-SA 4.0
2023-06-27T01:06:29.463
95388
2023-06-27T01:06:29.463
8589
95380
answer


### ポインターについて(の回答)

配列をセットする関数と, その内容を表示する関数を用意するなら  
(通常は) 関数の戻り値として 配列そのものではなくポインターを返します (無駄なコピーを行わない)

(質問はそのつもりのコードかも知れないけれど)

一次元配列であれば, 比較的容易で  
以下のポインターは `int`項目をポイントします  
(要素数 3 は, ポインターの宣言には含まれないことに注意)

[code]

    #include <stdio.h>
    
    static int *
    init(void)
    {
        static int arr[] = {10, 20, 30};
        return arr; // 配列の先頭のアドレス
    }
    
    static void
    output(const int *p, int n)
    {
        for (int i = 0; i < n; i++)
            printf("%d, ", p[i]);
        printf("\n");
    }
    
    int
    main(void)
    {
        const int *p = init();
        output(p, 3);
        return 0;
    }
    
[/code]

#### 間違ったポインター指定

以下のコードでは `[3][4]` で要素数 12個の配列 へのポインター, という意味になる  
インデックス `0`でポイントすると(指し示すと), 12 項目の `int`  
また, 「次」の位置 (ptr +1) は 48 Bytes先のアドレス  
(質問のコードでは 400 項目の `int` となる)

[code]

        const int (*ptr)[3][4];
        printf("ptr size\t%zu \n", sizeof ptr);
        printf("[0] size\t%zu \n", sizeof ptr[0]);
        printf("elem count\t%zu \n", sizeof ptr[0] / sizeof (int));
    // ptr size        8
    // [0] size        48
    // elem count      12
    
        ptr = (int (*)[3][4])0xdeadbeef0000;
        printf("ptr +0\t%p \n", (const void *)ptr);
        printf("ptr +1\t%p \n", (const void *)(ptr +1));
    // ptr +0  0xdeadbeef0000
    // ptr +1  0xdeadbeef0030
    
[/code]

* * *

二次元配列でアクセスするなら, 実際には 以下のように記述できます  
(型宣言は上記同様な感じで)

[code]

        const int (*p)[YOKO_MAX] = fn();
    
[/code]


CC BY-SA 4.0
2023-06-30T06:00:27.773
95422
2023-06-30T06:00:27.773
43025
95380
answer


2次元配列（以下，配列）の初期化のために「配列を初期化し，そのポインタを返す関数」を用いようとしているコードと推察されます。  
それを前提とすると，記述上の主な問題点としては以下の3点が考えられます。

  * 配列のポインタの記述には括弧が必要（括弧がないと配列の要素がポインタの意味になる），（次項を前提に）関数の戻り値の型指定も同様だが更に配列形状の指定も必要

  * 関数の戻り値がメイン側の記述（配列のポインタへの代入）と不整合で，戻り値は配列のアドレスにすべき

  * 配列の記憶域は関数側で確保（`a`）しているが，処理がメイン側に戻った後も確保を続ける（静的に確保する）には `static` が必要

オリジナルを基に上記の問題点（とその他）を改善した記述例を下記に示します。なお，出力形式を一部変更しています。

[code]

    #include <stdio.h>
    
    #define TATE_MAX 20
    #define YOKO_MAX 20
    
    int (*createMap(void))[TATE_MAX][YOKO_MAX];
    
    int main(void)
    {
         int (*field)[TATE_MAX][YOKO_MAX] = createMap();
         int i, j;
    
         for (i = 0; i < TATE_MAX; i++) {
              for (j = 0; j < YOKO_MAX; j++)
                   printf(" %2d", (*field)[i][j]);
              printf("\n");
         }
    }
    
    int (*createMap(void))[TATE_MAX][YOKO_MAX]
    {
         static int a[TATE_MAX][YOKO_MAX];
         int i, j;
    
         for (i = 0; i < TATE_MAX; i++)
              for (j = 0; j < YOKO_MAX; j++)
                   if (i == 0 || i == TATE_MAX - 1
                       || j == 0 || j == YOKO_MAX - 1)
                        a[i][j] = 1;
                   else
                        a[i][j] = 0;
    
         return &a;
    }
    
[/code]

[code]

      1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1
      1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
    
[/code]


CC BY-SA 4.0
2023-07-01T04:28:25.360
95436
2023-07-01T04:28:25.360
54588
95380
answer