标签: malloc

如何在C++中创建一个数组而不是堆栈?

我有一个非常大的数组,其长度必须为262144个元素(未来可能会大得多).我试过在堆栈上分配数组,如下所示:

#define SIZE 262144
int myArray[SIZE];
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试添加元素超过某个点时,当我尝试访问它们时,值会有所不同.我知道这是因为堆栈上只有一个有限的内存,而不是具有更多内存的堆.

我没有太多运气(不编译)尝试了以下内容:

#define SIZE 262144
int *myArray[SIZE] = new int[SIZE];
Run Code Online (Sandbox Code Playgroud)

然后我考虑使用malloc,但我想知道是否有更多C++这样做的方式......

#define SIZE 262144
int *myArray = (int*)malloc(sizeof(int) * SIZE);
Run Code Online (Sandbox Code Playgroud)

我应该一起去malloc吗?

c++ arrays heap malloc stack

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

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

如何限制使用`malloc()`获取的内存而不限制堆栈?

我试图阻止学生代码在分配中运行,并拖延我的测试机器.我试过了

setrlimit(RLIMIT_DATA, r);
Run Code Online (Sandbox Code Playgroud)

哪个r是持有限制的结构.但不幸的是,虽然这个限制停止brk并且sbrk分配,但是C库只是故障转移mmap并保持正确分配.

我也试过了

setrlimit(RLIMIT_AS, r)
Run Code Online (Sandbox Code Playgroud)

并且这会使进程停止,但是这种补救措施太严重了 - 进程无法从ENOMEM错误中恢复,因为代码在遇到NULL返回的值时所进行的调用没有堆栈空间malloc().

我对二进制文件的控制有限,所以如果可以用系统调用,我宁愿这样做.但我需要一些方法来限制分配,而不会破坏流程的恢复能力.有没有人有建议?

更新:我找到了一个名为failmalloc的东西,但它不是很复杂,虽然我可以导致它失败,但我总是遇到gdb无法诊断的段错误.

进一步更新:我发现setrlimit(RLIMIT_AS, r) 似乎做我想要的工作,至少在被不相关的模块中发生的故障之后引起了某些情况下,该段错误.除非有人想出一些有趣的东西(或保留问题的理由),否则我可能会删除这个问题.

c malloc setrlimit

12
推荐指数
2
解决办法
1202
查看次数

Linux和Windows上的malloc_size替代方案

在给定void *指针的情况下,如何判断在给定地址上分配的块的大小(先前使用malloc在Linux和Windows中分配)?我希望两个系统肯定会在某处存储这种信息.也就是说,malloc_sizeOSX/Darwin上存在替代方案.如果它有帮助,使用gcc/mingw.

c linux windows malloc gcc

12
推荐指数
1
解决办法
5349
查看次数

我如何使用strdup?

我正在调用strdup,必须在调用之前为变量分配空间strdup.

char *variable;
variable = (char*) malloc(sizeof(char*));
variable = strdup(word);
Run Code Online (Sandbox Code Playgroud)

我这样做了吗?或者这里有什么问题吗?

c malloc strdup

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

如何在OS X下覆盖malloc(),calloc(),free()等?

假设最新的XCode和GCC,覆盖内存分配函数的正确方法是什么(我猜运算符new/delete也是如此).调试内存分配器对于游戏来说太慢了,我只需要一些基本的统计数据,我可以自己做,影响最小.

我知道它在Linux中很容易因为钩子而存在,而且在十年前编写HeapManager时,这在codewarrior下是微不足道的.

可悲的是,smartheap不再有mac版本.

malloc macos xcode overriding

11
推荐指数
2
解决办法
6610
查看次数

为什么故意不正确地使用strcpy不会失败呢?

为什么以下C代码使用strcpy对我来说很好?我尝试以两种方式使其失败:

1)我尝试strcpy从字符串文字到分配的内存太小而不能包含它.它复制了整件事并且没有抱怨.

2)我尝试strcpy了一个未被NUL终止的数组.在strcpyprintf工作就好了.我原本以为strcpy复制了chars直到NUL找到了,但没有一个存在,它仍然停止.

为什么不这些失败?我是以某种方式获得"幸运",还是我误解了这个功能是如何工作的?它是特定于我的平台(OS X Lion),还是大多数现代平台以这种方式工作?

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

int main() {
    char *src1 = "123456789";
    char *dst1 = (char *)malloc( 5 );

    char src2[5] = {'h','e','l','l','o'};
    char *dst2 = (char *)malloc( 6 );

    printf("src1: %s\n", src1);
    strcpy(dst1, src1);
    printf("dst1: %s\n", dst1);
    strcpy(dst2, src2);
    printf("src2: %s\n", src2);
    dst2[5] = '\0';
    printf("dst2: %s\n", dst2);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行此代码的输出是:

$ ./a.out …
Run Code Online (Sandbox Code Playgroud)

c malloc strcpy

11
推荐指数
2
解决办法
1410
查看次数

为什么new不需要对指针进行强制转换,即使malloc需要它?

<new>标题中new的定义是:

 void* operator new(size_t);
Run Code Online (Sandbox Code Playgroud)

malloc的定义如下:

 void* malloc(size_t);
Run Code Online (Sandbox Code Playgroud)

现在,由于C++是一种强类型语言,它需要程序员的强制转换才能将void*指针转换为程序员所需的类型...在malloc中,我们必须执行强制转换,但不是新的,尽管两者都返回一个void*指针.为什么?

c++ malloc new-operator

11
推荐指数
2
解决办法
357
查看次数

在使用malloc分配新内存后,是否必须调用memset

#include "stdlib.h"
#include "stdio.h"
#include "string.h"
int main(int argc, char* argv[])
{
    int *test = malloc(15 * sizeof(int));
    for(int i = 0;i < 15 ;i  ++ )
        printf("test is %i\n",test[i]);

    memset(test,0,sizeof(int) * 15);

    for(int i = 0 ; i < 15; i ++ )
        printf("test after memset is %i\n",test[i]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出非常奇怪:

    test is 1142126264
    test is 32526
    ...
    test is 1701409394
    test is 1869348978
    test is 1694498930
    test after memset is 0
    test after memset is 0
    test …
Run Code Online (Sandbox Code Playgroud)

c malloc memset

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

释放已分配的内存:realloc()与free()

所以我分配了一块内存,malloc()稍后再更改realloc().

在我的代码中的某些时候我想要清空它,我的意思是基本上给它0的记忆.直观地完成它的东西realloc(pointer,0).我在这里读到这是实现定义的,不应该使用.

我应该改用free(),再做另一个malloc()吗?

c memory malloc free realloc

11
推荐指数
2
解决办法
4647
查看次数