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 回答