我有一个非常大的数组,其长度必须为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吗?
如果这是一个坏主意,如何在函数中分配内存?
我试图阻止学生代码在分配中运行,并拖延我的测试机器.我试过了
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) 它似乎做我想要的工作,至少在被不相关的模块中发生的故障之后引起了某些情况下,该段错误.除非有人想出一些有趣的东西(或保留问题的理由),否则我可能会删除这个问题.
在给定void *指针的情况下,如何判断在给定地址上分配的块的大小(先前使用malloc在Linux和Windows中分配)?我希望两个系统肯定会在某处存储这种信息.也就是说,malloc_sizeOSX/Darwin上存在替代方案.如果它有帮助,使用gcc/mingw.
我正在调用strdup,必须在调用之前为变量分配空间strdup.
char *variable;
variable = (char*) malloc(sizeof(char*));
variable = strdup(word);
Run Code Online (Sandbox Code Playgroud)
我这样做了吗?或者这里有什么问题吗?
假设最新的XCode和GCC,覆盖内存分配函数的正确方法是什么(我猜运算符new/delete也是如此).调试内存分配器对于游戏来说太慢了,我只需要一些基本的统计数据,我可以自己做,影响最小.
我知道它在Linux中很容易因为钩子而存在,而且在十年前编写HeapManager时,这在codewarrior下是微不足道的.
可悲的是,smartheap不再有mac版本.
为什么以下C代码使用strcpy对我来说很好?我尝试以两种方式使其失败:
1)我尝试strcpy从字符串文字到分配的内存太小而不能包含它.它复制了整件事并且没有抱怨.
2)我尝试strcpy了一个未被NUL终止的数组.在strcpy与printf工作就好了.我原本以为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) <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*指针.为什么?
#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) 所以我分配了一块内存,malloc()稍后再更改realloc().
在我的代码中的某些时候我想要清空它,我的意思是基本上给它0的记忆.直观地完成它的东西realloc(pointer,0).我在这里读到这是实现定义的,不应该使用.
我应该改用free(),再做另一个malloc()吗?