7

配列のサイズを変更できるようにしたいので、次のように作成します。

int* array;
array = malloc(sizeof(int)*10);//10 integer elements

これは通常どおり配列のように使用できますが、サイズを次のように見つけようとすると、次のようになります。

size = sizeof(array)/sizeof(int);

配列を指していると認識されないため、答え1が得られます

配列のサイズを取得するにはどうすればよいですか?(技術的には配列ではないことは知っていますが、割り当てられたメモリブロックのサイズ全体を計算する方法はありますか?)

また、私は説明で述べたことを仮定するのは正しいですか?私が何かについて技術的に間違っている場合は、私を訂正してください。

4

5 に答える 5

11

ポインターポインターであり、配列ではありません。配列ではないため、「配列として認識」されることはありません。

配列のサイズを覚えておくのは完全にあなた次第です。

例えば:

struct i_must_remember_the_size
{
    size_t len;
    int * arr;
};

struct i_must_remember_the_size a = { 10, NULL };
a.arr = malloc(a.len * sizeof *a.arr);
于 2012-08-26T16:47:07.647 に答える
3

あなたが求めることをするための標準的な方法はありません。一部のコンパイラはそのための関数を提供する場合もあれば、他のアロケータがそのような関数を使用する場合もありますが、すでに述べたように、標準はありません。

sizeof「配列からのように」ポインタを認識するため、適用された配列は機能しないことに注意してください。引数を配列として認識するだけです(sizeof配列が最初の要素へのポインタに減衰しない数少ないコンテキストの1つです)。 ); 配列がポインタに減衰すると、ポインタsizeofのサイズのみが生成されます。

于 2012-08-26T16:45:39.217 に答える
3

C標準およびポータブルでは、それは不可能です。一部のコンパイラは非標準の拡張機能を提供していることに注意してください(たとえば、それを追跡しますmsize)。

さらに、sizeof演算子はブロックのサイズを教えてくれないので、ポインターのサイズを生成します(sizeof可変長配列を除いて、コンパイル時に動作することを忘れないでください)。

したがって、たとえば次のようなデータ構造では、割り当てられたサイズを維持する必要があります。

#include <stddef.h>

typedef struct {
    int   *p;
    size_t n;
} array;
于 2012-08-26T16:45:48.693 に答える
3

まず、sizeof()は「タイプ」のサイズを返します。割り当てられたメモリについては何も知りません。

次に、コンパイラのランタイムライブラリの内部を掘り下げたい場合を除いて、malloc()されたブロックのサイズを取得する方法はありません。これは間違いなく良い考えではありません。特に、他の場所でサイズを覚えていても問題がないためです。メモリブロックの前に別のアイテムを付けてサイズを保存するか、個別に保存することができます。

于 2012-08-26T16:47:04.073 に答える
1

要素へのポインタ型ではなく、配列へのポインタ型を使用します。

int (*parray)[10] = malloc(sizeof *parray);

次にsizeof *parray、目的の答えが得られますが、のように(または、紛らわしいとはいえ)、*演算子を使用して配列にアクセスする必要があります。最新のCでは、変数に置き換えることができることに注意してください。(*parray)[i]parray[0][i]10

于 2012-08-26T18:42:35.503 に答える