C-怎样得到指针所指空间大小

C-怎样得到指针所指空间大小

甜柠檬 发布于 2017-09-22 字数 400 浏览 1219 回复 7

如果我用malloc申请了一块内存空间
如 void *p = malloc(100);
把指针做为参数传进一个函数中如TestFunction(p);
在此函数中我如何通过P来获得它指向的空间的大小?

谢谢大家的热情回答
我想追问一下,如果是栈空间呢,不传递长度里去的话,有办法通过指针得到栈空间大小吗?
如 BYTE b[256] = {0};
TestFunction((LPVOID)b);
在此函数中我能通过b来获得它指向的空间的大小吗?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

清晨说ぺ晚安 2017-10-21 7 楼

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

int main()
{
int *p=NULL;
int *q=NULL;
int *v=NULL;
p=(int *)malloc(sizeof(int)*2);
v=(int *)malloc(sizeof(int));
printf("ad:%xt%xt%xn",p,v,v-p);

*p=0;
*(p+1)=1;
q=p+1;

*v=2;

printf("%xt%xn",*q,*v);

free(p);

printf("%xt%xn",*q,*v);
return 0;
}

刚写这了这么一段代码(轻喷)
环境是codeblocks 13.12 + g++

这里可以看出free函数释放的过程中是知道p所指向空间的大小
楼主可以查查free源码看看如何实现的

夜无邪 2017-10-17 6 楼

堆上分配的空间要手动释放,栈上的空间由系统释放
比如用malloc分配的是在堆上的,所以要用free手动释放
栈上空间比如说函数传如的值,由系统自动释放
比如 int* a = malloc(100);
要free(a)释放a指向的内存,但a这个变量所占的空间不用管它,系统自动会处理的粗体文本

清晨说ぺ晚安 2017-10-13 5 楼

另一种方式,数据大小放在内存开头

 typedef struct
{
int dimension; // 空间大小
int data[1]; // 内存数据。。
} malloc_int_t;

malloc_int_t *ab;

int dimension = 10;
ab = malloc( sizeof(*ab) + (dimension-1)*sizeof(int) );
ab->dimension = dimension;

ab->data[n] // 访问数据

想挽留 2017-10-11 4 楼

直接调用_msize即可。

int size = _msize(p);

参考:_msize, _bmsize, _fmsize, _nmsize

灵芸 2017-10-10 3 楼

最好把指针和长度都写在参数中吧,易读性会更好。

void test(int a[10])倒是可以用于你的第二个问题。

归属感 2017-10-04 2 楼

我了个去,获取堆大小比较难,除非dbg形式的比较简单.release下就windows下不同的版本堆分配算法都不一样.malloc是直接调用的RtlHealpAllocate,使用RtlHealpSize可以获取.

BYTE b[256] = {0};
TestFunction((LPVOID)b);
sizeof(b)就是占用栈的大小.

虐人心 2017-10-03 1 楼

下面是写着玩的。。。

typedef unsigned int uint32;
void* allocMemory(uint32 n,uint32 itemsize)
{
void *p = calloc(itemsize*n+sizeof(unsigned long int),1);
*((unsigned long int*)p) = n;
return ((unsigned long int*)p+1);
}
void freeMemory(void* mem)
{
free ((void*)((unsigned long int*)mem-1));
}

uint32 getmemlength(void* mem)
{
return (uint32)(*((unsigned long int*)mem-1));
}