以下の様に引数としてchar型配列の先頭を指すポインタが入ってきた場合、string_ptrを用いてchar型配列の要素数を知りたいです。

```

    void hoge(char* string_ptr) {
       
        //char string[100]の場合
        //sizeof(string)/sizeof(char)で割り出せる
    }
    
```
CC BY-SA 4.0
2023-02-17T02:52:13.537
93880
2023-03-29T06:29:05.950
55686
question
c
配列のポインタから要素数を出したい
不可能です（だからバッファオーバーラン脆弱性がいまだに発生し続けている）

別途引数を設けるのが普通 `void hoge(char* string_ptr, ssize_t bufsize);`  
`hoge()` 側で動的にメモリをとるのが次善

```

    char* hoge() {
        char* p=NULL;
        for (ループ条件) {
            char* q=realloc(p, newsize);
            if (q==NULL) { エラー処理して脱出; }
            // エラーが起きていない場合に限り継続
            p=q;
            何らかの処理を p に対して行う;
        }
        return p; // free() するのは呼んだ側の責務
    }
    
```

[c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") 化して `str::string` や
`std::vector` や `std::array` を使うのもよし  
[c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") ならこんなイディオムもあり

```

    template<typename T, size_t N>
    void hoge(T (&array)[N]) { ... }
    
```

# 組み込み系だと c++11 にすら対応してないのでこうするしかない
CC BY-SA 4.0
2023-02-17T04:05:55.483
93882
2023-02-17T04:26:50.187
2023-02-17T04:26:50.187
8589
8589
93880
answer
配列であるなら、おっしゃるように要素数は算出できますが、  
ポインタではそれは不可能です
CC BY-SA 4.0
2023-02-17T04:36:11.207
93884
2023-02-17T04:36:11.207
27481
93880
answer
### 回答

> 配列のポインタから要素数を出したい

以下のように、仮引数の宣言を型と要素数を指定したポインタにすれば可能です。

```

    void hoge(char (*string_ptr)[100])
    {
        printf("sizeof(*string_ptr)/sizeof(char)=%lu\n", sizeof(*string_ptr)/sizeof(char));
    }
    
```

以下のように、引数を配列形式で宣言する方法はNGです。

```

    void hoge(char string[100])
    {
        printf("sizeof(string)/sizeof(char)=%lu\n", sizeof(string)/sizeof(char));
    }
    
```

配列形式の仮引数`char string[100]`は`char *`とみなされるようです。  
実行した結果も期待した結果になりません。`sizeof(string)`がポインタ変数のサイズになるからです。

なおコンパイルすると以下のような警告が出ます。

```

    warning: sizeof on array function parameter will return size of 'char *' instead of 'char[100]' [-Wsizeof-array-argument]
    
```

* * *

### 配列のポインタについて

#### 参考情報

書籍 K&Rのプログラミング言語Ｃ(isbn:9784320021457) P114  
同じくK&Rのプログラミング言語C〔第2版〕(isbn:9784320026926) P137  
に例が載っていました。

#### コンパイラ

動作確認に使用したコンパイラは以下です。

  * gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
  * Ubuntu clang version 14.0.0-1ubuntu1
  * Microsoft Visual Studio Community 2022 Version 17.2.6

#### 動作確認用コードと実行結果

動作確認に使用したコードは以下です。

```

    #include <stdio.h>
    #include <stdlib.h>
    void hoge(char (*string_ptr)[100]);
    void hoge2(char string[100]);
    int main()
    {
        char string[100];
        printf("sizeof(string)/sizeof(char)=%lu\n", sizeof(string)/sizeof(char));
        hoge(&string);
        hoge2(string);
        return 0;
    }
    void hoge(char (*string_ptr)[100])
    {
        printf("sizeof(*string_ptr)/sizeof(char)=%lu\n", sizeof(*string_ptr)/sizeof(char));
    }
    void hoge2(char string[100])
    {
        printf("sizeof(string)/sizeof(char)=%lu\n", sizeof(string)/sizeof(char));
    }
    
```

実行結果は以下です。

> sizeof(string)/sizeof(char)=100  
>  sizeof(*string_ptr)/sizeof(char)=100  
>  sizeof(string)/sizeof(char)=8
CC BY-SA 4.0
2023-02-17T15:28:46.720
93898
2023-03-29T06:29:05.950
2023-03-29T06:29:05.950
35558
35558
93880
answer