1

char 配列を動的に作成しようとしています。ただし、サイズ配列の目的の値としてどの数値を入力しても、4 を使用し続けるとサイズがあります。3、2、8、10 を配置しても変わらない...

初期化する部分...

char *x;

x = (char *)calloc(10, sizeof(char));

if(x == NULL )
{
    return;
}

cout <<"Size_Vector = "<<sizeof(x)<<endl; //Keep making the size of the array 4..no matter what
4

4 に答える 4

2

x型のポインタですchar *。配列サイズではなくポインタのサイズをsizeof(x)返します。

一般に、配列が減衰するため、ポインター型が配列を指している場合でも、ポインター型から配列サイズを知る方法はありません。

char *x = malloc(sizeof(char)*10);
// This will give you 4
printf ("%d\n", sizeof(x));

ただし、配列型のサイズを取得できます。

char x[10];
// This will give you 10
printf ("%d\n", sizeof(x));
于 2012-04-18T04:33:40.970 に答える
2

sizeof(x)割り当てられたメモリや配列のサイズではなく、ポインターのサイズを返します。

4環境上のポインターのサイズは常に返され4、すべて同じになります。

自分で割り当てたメモリの量を追跡し、割り当てられたメモリの境界を超えて書き込みをしないようにする必要があります。

于 2012-04-18T04:33:57.030 に答える
0

malloc 呼び出しは void ポインターを返し、 sizeof(pointer) と言うと、宣言したばかりのメモリのチャンクではなく、ポインターのサイズを要求します。したがって、m に応じて 4/8/... バイトが得られます。 /c を使用しています。

これを試してください:

char *cptr;

int *iptr;

printf("size of integer pointer is : %d\n",sizeof(iptr));


printf("size of character pointer is : %d\n",sizeof(cptr));

注 : mallocは、呼び出して動的に取得したメモリのチャンク (つまり、10 * 1 = 10 バイト) の最初の要素のアドレスを指します。

于 2012-04-18T05:07:52.137 に答える
0

これは、 calloc を呼び出して予約したメモリのサイズを本当に知りたい場合に備えて、私が書いた短いコードですが、1 バイトのスペースを 10 個言うと、10 バイトになることは明らかです。 10 * sizeof(char) が欲しいと言うここのケースのように:

#include<stdio.h>

#include<stdlib.h>

main(){

    char *ptr = NULL;

    int i = 0;

    int size = 0;

    int n = 0;

    printf("Enter the size of the dynamic array in bytes : ");

    scanf("%d",&n);

    ptr = (char*) calloc (n,sizeof(char));

    for(i=0;i<n;i++){

            size = size + sizeof(ptr[i]);

    }

    printf("Size is %d\n",size);

}
于 2012-04-18T05:38:11.537 に答える