私は配列(メモリ内の配列)のポインタを持っています。 ポインタから配列のサイズを計算することはできますか? 私は実際にどこの配列がメモリにあるのか分かりません。 私はポインタアドレスを取得しています(仮定9001) そのアドレスを使用して私は配列のサイズを計算する必要があります。ポインタ変数から配列のサイズを計算するには?
ありがとうございました。
私は配列(メモリ内の配列)のポインタを持っています。 ポインタから配列のサイズを計算することはできますか? 私は実際にどこの配列がメモリにあるのか分かりません。 私はポインタアドレスを取得しています(仮定9001) そのアドレスを使用して私は配列のサイズを計算する必要があります。ポインタ変数から配列のサイズを計算するには?
ありがとうございました。
いいえ、配列のサイズを計算することはできません。 C言語のオブジェクトは型情報を持ちませんので、事前に配列のサイズを知っておく必要があります。このような何か:
void my_function(int array[], int size);
個人的には、 'int array []'を関数のパラメータとして使用することを控えてください。原則として、 'array'は1つ以上の' int'のうちの最初のものへのポインタであることを伝えることで、読者を助けるかもしれません。実際には、(1) 'size'はすでにそれを伝えています。 (2)人々は 'char * 'にも対処できるように' char [] 'ではなく、文字列の最初の文字にポインタを渡すときに' char * 'を使うのに慣れています。 (3)異なる構文は、初心者が誤って「int * array」と何とか違っていると考えてしまうことがよくあります。 –
質問が簡単になればなるほど、自転車の脱落が大きくなります。 –
ええ、あなたはおそらく正しいでしょう。配列(とその最初の要素へのポインタ)がどのように動作するのか混乱/無知であるという質問で、配列(そして最初の要素へのポインタ)の働きを人に混乱させるものは、正解の栄光に比べて些細なものです。 –
あなたがCでポインタのサイズをこれを行うことはできませんが、ポインタのサイズではなく、それはがでを指している可能性のある配列のサイズです。
配列を指すポインタ(char *pch = "hello";
のような明示的なものや、関数に配列を渡すなどの暗黙のうちに配列の崩壊を暗黙的に指定するもの)になった場合は、サイズ情報を個別に保持する必要があります以下のような:
int twisty[] = [3,1,3,1,5,9];
doSomethingWith (twisty, sizeof(twisty)/sizeof(*twisty));
:
void doSomethingWith (int *passages, size_t sz) { ... }
次のコードは、このことを示しています
#include <stdio.h>
static void fn (char plugh[], size_t sz) {
printf ("sizeof(plugh) = %d, sz = %d\n", sizeof(plugh), sz);
}
int main (void) {
char xyzzy[] = "Pax is a serious bloke!";
printf ("sizeof(xyzzy) = %d\n", sizeof(xyzzy));
fn (xyzzy, sizeof(xyzzy)/sizeof(*xyzzy));
return 0;
}
私のシステム上の出力は次のとおりです。
sizeof(xyzzy) = 24
sizeof(plugh) = 4, sz = 24
24バイト配列が関数呼び出しで4バイトのポインタに減衰するためです。
Cの配列にはこの情報がありません。このデータで配列に変数 "next"を保持する必要があります。
自分が配列を持っていれば、sizeofを使用してコンパイル段階でサイズを取得できます。
char array1[XXX];
char* pointer1 = array1;
sizeof(array1); // this is XXX
sizeof(pointer1); // this is the size of a pointer in your system
次の操作を行うと、あなたのプログラムで変数を使用する(または、関数に配列を渡すときに機能するためにそれを渡す)
int array1size = sizeof(array1);
必要があり、これは[C#の]タグ付けされることを意味していますか?実際に[C]に問題があるようです。 – porges
これはC++テンプレートのほうが簡単です... – Lalaland
この質問に '[C]'または '[C++]'のどちらかとしてください。この質問では、1つの言語に適用できる回答は、他の言語には適用されません。 –