質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

731閲覧

main関数内での配列の要素数とユーザー関数の要素数が一致しない。

Savanof

総合スコア33

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/06/02 11:19

実現したいこと / 発生している問題

C言語において、配列の要素数を求めたいと思っています。配列の要素数を求めるコードを書いたのですが、同一の配列でも、main関数内での配列の要素数と自分が定義した関数内での配列の要素数が一致しなくて困っています。

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <stdint.h> 4#include <string.h> 5#include <strings.h> 6#include <memory.h> 7 8#define MAX_INPUT 100 9 10 11// fgetsの入力に改行が含まれる場合、削除する。 12void remove_newline_ch(char *line) 13{ 14 int new_line = strlen(line) -1; 15 if (line[new_line] == '\n') 16 line[new_line] = '\0'; 17} 18 19 20// 関数内での配列の要素数をprintf 21void FuncSize(int *ObjArray){ 22 23 // 配列のサイズを入手する。 24 int ArraySize = sizeof(ObjArray) / sizeof(ObjArray[0]); 25 printf("VoidLength %d\n",ArraySize); 26 27} 28 29 30// main 31int main(){ 32 33 char input1[MAX_INPUT]; 34 int input1_siz; 35 36 printf("Enter The Number \n"); 37 fgets(input1 , MAX_INPUT , stdin); 38 remove_newline_ch(input1); 39 40 input1_siz = strlen(input1); 41 42 int N = input1_siz; 43 int ans_lis[N]; 44 45 int Size = sizeof(ans_lis) / sizeof(ans_lis[0]); 46 47 printf("N Length %d\n",N); 48 printf("ans_lis Length %d\n",Size); 49 FuncSize(ans_lis); 50 51}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

sizeof演算子は、関数ではなくマクロであると思ってください。

コンパイル時に値が確定するわけであって、動作状況に合わせて値が変動するものではありません。演算子の中身が固定長配列ならば要素のサイズ×配列長、演算子の中身がポインタであればポインタサイズ(この場合は4)になります。

ポインタ参照先の配列要素数の影響を受けることはありません。

C

1char* p; 2char data[100]; 3 4p = data; 5printf("%d", sizeof(data) ); 6//100と表示される。 7 8printf("%d", sizeof(p) ); 9//4と表示される(ポインタサイズが4の場合)。100ではない。 10

投稿2021/06/02 11:50

編集2021/06/02 11:52
HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/06/02 12:07

> コンパイル時に値が確定するわけであって、動作状況に合わせて値が変動するものではありません。 VLA、という例外があります。
HogeAnimalLover

2021/06/02 12:46

>>VLAがありましたね。補足ありがとうございます。
guest

0

main側
int Size = sizeof(ans_lis) / sizeof(ans_lis[0]);
こちらは、 N となったでしょうか。

関数側
int ArraySize = sizeof(ObjArray) / sizeof(ObjArray[0]);
この内、sizeof(ObjArray) これは、引数でのint *ObjArray から、ポインタサイズ? だったでしょうか? 期待する結果にはならないと思われます。

Cでの関数に 一次元配列を渡した場合、先頭のアドレスなので、配列サイズを知る事はできまません。ひつような場合、別途(引数とかで) 配列をサイズを渡す必要があります。

投稿2021/06/02 11:32

pepperleaf

総合スコア6385

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

平たく言うと無理です。

なのでc言語では配列を渡す場合、引数で要素数を一緒に渡します。

それか文字列のように、「最終の要素は0である」みたいな取り決めをして人間側が気をつけます。

投稿2021/06/02 11:29

ozwk

総合スコア13553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

C言語において、配列の要素数を求めたいと思っています。

残念ながら、C言語では引数として渡した配列の要素数を取る方法はありません(別途でサイズを渡すか、末尾に\0を入れる文字列のように、データ構造で末尾を把握できるようにするしか対応策はありません)。

sizeof(ObjArray)は、ポインタ自体のサイズです。

投稿2021/06/02 11:28

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/06/02 11:37

いちおう、「配列全体へのポインタ」というものを渡す方法もなくはないですが、コンパイル時に長さが決まっている場合に限られるなど、一般的な手法ではありません。
Savanof

2021/06/03 10:21

無理なんですね...今までPythonとかモダンな言語しか使った事がないので知りませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問