0

malloc を使用して割り当てられたポインターを使用して配列のサイズを知るにはどうすればよいですか?

#include <stdio.h>

int main(){
    int *ptr = (int *)malloc(sizeof(int * 10));
    printf("Size:%d",sizeof(ptr));
    free(ptr_one);
    return 0;
}

この場合、ポインターのサイズは 8 だけです。コードを変更して、40 になる配列のサイズを取得する方法。

4

2 に答える 2

6

それはいけません。
自分で帳簿をつけて記録する必要があります。new動的メモリを割り当て、メモリの割り当てを解除しているときに を呼び出すだけです。これdeleteは、言語が内部的に処理するため、割り当てを解除したメモリの量を知っているため、ユーザーは簿記について気にする必要がありません。それでも明示的に必要な場合は、別の変数で追跡する必要があります。

于 2013-09-02T10:00:26.477 に答える
0

マシンが 32 ビットの場合、ポインターのサイズは常に 4 バイトのデータ型になります。

マシンが 64 ビットの場合、ポインターのサイズは常に 8 バイトのデータ型になります。

静的配列を宣言すると、次を使用してサイズが取得されますsizeof

int a[10];

printf("Size:%lu",sizeof(a));

しかし、ポインターによってブロックされている配列のサイズを取得できませんでした。ブロックへのメモリは、 malloc を使用して動的に割り当てられます。

以下のコードを参照してください。

#include <stdio.h>
#include<stdlib.h>

int main()
{
  int i;
  int *ptr = (int *)malloc(sizeof(int) * 10);
  //  printf("Size:%lu",sizeof(ptr)); 
  // In the above case sizeof operater returns size of pointer only.   
    for(i=1;ptr && i<13 ;i++,ptr++)
       {
    printf("Size:%d  %p\n",((int)sizeof(i))*i,ptr);

       }

    return 0;
}

出力:

Size:4  0x8ec010
Size:8  0x8ec014
Size:12  0x8ec018
Size:16  0x8ec01c
Size:20  0x8ec020
Size:24  0x8ec024
Size:28  0x8ec028
Size:32  0x8ec02c
Size:36  0x8ec030
Size:40  0x8ec034  //after this there is no indication that block ends. 
Size:44  0x8ec038
Size:48  0x8ec03c
于 2013-09-02T09:59:46.167 に答える