我已经分配了一个像这样mystruct大小的"数组" n:
if (NULL == (p = calloc(sizeof(struct mystruct) * n,1))) {
/* handle error */
}
Run Code Online (Sandbox Code Playgroud)
后来,我只能访问p,不再拥有n.有没有办法只给出指针确定数组的长度p?
我认为它必须是可能的,因为free(p)就是这样.我知道malloc()它记录了它分配了多少内存,这就是它知道长度的原因; 也许有办法查询这些信息?就像是...
int length = askMallocLibraryHowMuchMemoryWasAlloced(p) / sizeof(mystruct)
Run Code Online (Sandbox Code Playgroud)
我知道我应该修改代码,以便我知道n,但如果可能,我宁愿不这样做.有任何想法吗?
这个问题的灵感来自一个类似的问题:delete []"如何"知道操作数数组的大小?
我的问题有点不同: 有没有办法以编程方式确定C++数组的大小?如果没有,为什么? 我看到的每个接受数组的函数也需要一个整数参数来赋予它大小.但正如链接问题指出的那样,delete[]必须知道要释放的内存大小.
考虑这个C++代码:
int* arr = new int[256];
printf("Size of arr: %d\n", sizeof(arr));
Run Code Online (Sandbox Code Playgroud)
这打印" Size of arr: 4",这只是指针的大小.有一些打印256的函数会很好,但我不认为C++中存在一个函数.(同样,问题的一部分是为什么它不存在.)
澄清:我知道如果我在堆栈上声明数组而不是堆(即" int arr[256];"),则sizeof运算符将返回1024(数组长度*sizeof(int)).
编程语言:C平台:ARM编译器:ADS 1.2
我需要跟踪melloc/free项目中的简单调用.我只需要了解程序分配了所有资源后需要多少堆内存的基本概念.因此,我为malloc/free调用提供了一个包装器.在这些包装器中,我需要在malloc调用时递增当前内存计数,并在free调用时递减它.这个malloc案例很简单,因为我有来自调用者的大小.我想知道如何处理这种free情况,因为我需要在某处存储指针/大小映射.这是C,我没有标准的地图来轻松实现这一点.
我试图避免在任何库中链接,所以更喜欢*.c/h实现.
所以我想知道是否已经有一个简单的实现可能会引导我.如果没有,这是继续实施的动机.
编辑:纯粹用于调试,此代码不随产品提供.
编辑:根据Makis的回答进行初步实施.我很感激对此的反馈.
编辑:重新实施
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <limits.h>
static size_t gnCurrentMemory = 0;
static size_t gnPeakMemory = 0;
void *MemAlloc (size_t nSize)
{
void *pMem = malloc(sizeof(size_t) + nSize);
if (pMem)
{
size_t *pSize = (size_t *)pMem;
memcpy(pSize, &nSize, sizeof(nSize));
gnCurrentMemory += nSize;
if (gnCurrentMemory > gnPeakMemory)
{
gnPeakMemory = gnCurrentMemory;
}
printf("PMemAlloc (%#X) - Size (%d), Current …Run Code Online (Sandbox Code Playgroud) 我从C风格函数中获得了指向一大块已分配内存的指针.现在,调试目的非常有趣,以了解此指针指向的已分配内存块有多大.
是否有什么比通过盲目地越过边界而挑起异常更优雅?
提前谢谢,安德烈亚斯
我在Windows上使用VC++ 2005,在Linux上使用GCC 4.3
我_msize在VC++ 2005下不幸的是它在调试模式下导致异常....
好.我尝试过上面描述的方式,但有效.至少在我调试并确保在调用库退出后立即执行时,我会在缓冲区边界上运行.奇迹般有效.
它只是不优雅,绝不可用于生产代码.
gcc 4.4.1 c89
我有以下代码片段:
#include <stdlib.h>
#include <stdio.h>
char *buffer = malloc(10240);
/* Check for memory error */
if(!buffer)
{
fprintf(stderr, "Memory error\n");
return 1;
}
printf("sizeof(buffer) [ %d ]\n", sizeof(buffer));
Run Code Online (Sandbox Code Playgroud)
但是,sizeof(缓冲区)总是打印4.我知道char*只有4个字节.但是,我已经分配了10kb的内存.那么尺寸不应该是10240吗?我想知道我在想什么?
非常感谢任何建议,
假设您通过malloc以下方式在堆上分配了一些内存:
someType x = malloc(someSize);
Run Code Online (Sandbox Code Playgroud)
当您不再需要时x,您free可以:
free(x)
Run Code Online (Sandbox Code Playgroud)
我想要执行此操作,编译器必须知道x指向的内存大小。我认为free执行类似:
x(假设为16)。如果以上内容是正确的,为什么标准中没有规定仅执行上述步骤直到第2步并将大小返回给程序员的函数,而实际上并未释放内存?
我在网上阅读的一些(不太令人信服的)原因:
malloc()实现通常跟踪一个区域的大小,但是它们可以间接执行此操作,或将其舍入到某个值,或者根本不保留它。是真的吗 可能malloc无法跟踪大小?free已经实施,则只需要其中一部分;实施应该是微不足道的。那么,为什么没有提供此功能的理由是坚定的,推动的,真实的呢?或者,更有可能的是,为什么上述原因实际上很重要,而我又缺少什么呢?
我认为这个问题已经被问到了(很可能是一个骗子),但是我只能找到类似的主题(顺便说一句,下面的问题是我在上面发现的一些异议的地方):
这里讨论了这样的功能是否存在,但是为什么不存在。
这里讨论(堆栈分配的)数组。