相关疑难解决方法(0)

如何从C中的指针获取数组的大小?

我已经分配了一个像这样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,但如果可能,我宁愿不这样做.有任何想法吗?

c malloc pointers memory-management

66
推荐指数
4
解决办法
4万
查看次数

有没有办法以编程方式确定C++数组的大小?如果没有,为什么?

这个问题的灵感来自一个类似的问题: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++ arrays pointers memory-management

61
推荐指数
4
解决办法
6万
查看次数

简单的C实现跟踪内存malloc/free?

编程语言: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 dynamic-memory-allocation

11
推荐指数
1
解决办法
1万
查看次数

如何获取使用malloc()分配的内存块的大小?

可能重复:
如何从C中的指针获取数组的大小?
有没有办法以编程方式确定C++数组的大小?如果没有,为什么?

我从C风格函数中获得了指向一大块已分配内存的指针.现在,调试目的非常有趣,以了解此指针指向的已分配内存块有多大.

是否有什么比通过盲目地越过边界而挑起异常更优雅?

提前谢谢,安德烈亚斯

编辑:

我在Windows上使用VC++ 2005,在Linux上使用GCC 4.3

EDIT2:

_msize在VC++ 2005下不幸的是它在调试模式下导致异常....

EDIT3:

好.我尝试过上面描述的方式,但有效.至少在我调试并确保在调用库退出后立即执行时,我会在缓冲区边界上运行.奇迹般有效.

它只是不优雅,绝不可用于生产代码.

c c++ malloc memory-management

11
推荐指数
4
解决办法
3万
查看次数

将sizeof与动态分配的数组一起使用

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吗?我想知道我在想什么?

非常感谢任何建议,

c sizeof

8
推荐指数
2
解决办法
2万
查看次数

为什么C标准不公开要获取malloc块大小的函数?

假设您通过malloc以下方式在堆上分配了一些内存:

someType x  = malloc(someSize);
Run Code Online (Sandbox Code Playgroud)

当您不再需要时x,您free可以:

free(x)
Run Code Online (Sandbox Code Playgroud)

我想要执行此操作,编译器必须知道x指向的内存大小。我认为free执行类似:

  1. 读取中包含的值x(假设为16)。
  2. 确定以某种方式分配给16的内存大小(假设是8)。
  3. 告诉OS,不再需要16-23内存区域,并且OS可以用它做任何想做的事情。

如果以上内容是正确的,为什么标准中没有规定仅执行上述步骤直到第2步并将大小返回给程序员的函数,而实际上并未释放内存?

我在网上阅读的一些(不太令人信服的)原因:

  • malloc()实现通常跟踪一个区域的大小,但是它们可以间接执行此操作,或将其舍入到某个值,或者根本不保留它。是真的吗 可能malloc无法跟踪大小?
  • 因为C是一种低级编程语言,所以它希望您自己解决这些问题,但这在实现它的确切方式上增加了更大的灵活性。好的,这更具有哲学意义。尽管如此,C标准已经发展并随着时间的推移提供了更多的头文件,函数和工具。
  • 您应该重写每个编译器以实现该功能。真的吗?如果free已经实施,则只需要其中一部分;实施应该是微不足道的。

那么,为什么没有提供此功能的理由是坚定的,推动的,真实的呢?或者,更有可能的是,为什么上述原因实际上很重要,而我又缺少什么呢?

我认为这个问题已经被问到了(很可能是一个骗子),但是我只能找到类似的主题(顺便说一句,下面的问题是我在上面发现的一些异议的地方):

这里讨论了这样的功能是否存在,但是为什么不存在。

这里讨论(堆栈分配的)数组。

c

1
推荐指数
2
解决办法
166
查看次数