在Linux上,如果我去的话malloc(1024 * 1024 * 1024),malloc实际上做了什么?
我确定它为分配分配了一个虚拟地址(通过遍历空闲列表并在必要时创建新映射),但它实际上是否创建了1 GiB的交换页面?或者它mprotect是地址范围并在您实际触摸它们时创建页面mmap吗?
(我正在指定Linux,因为标准对这些细节没有提及,但我有兴趣知道其他平台也会这样做.)
我正在实现一个除法和征服多项式算法,所以我可以将它与OpenCL实现进行基准测试,但我无法开始malloc工作.当我运行程序时,它会分配一堆东西,检查一些东西,然后发送size/2给算法.然后,当我malloc再次点击它时,它会吐出这个:
malloc.c:3096:sYSMALLOc:断言`(old_top ==(((mbinptr)(((char*)&((av) - > bins [((1) - 1)*2])) - __builtin_offsetof(struct malloc_chunk,fd))))&& old_size == 0)|| ((unsigned long)(old_size)> =(unsigned long)(((__ builtin_offsetof(struct malloc_chunk,fd_nextsize))+((2*(sizeof(size_t))) - 1))~~((2*(sizeof) (size_t))) - 1)))&&((old_top) - > size&0x1)&&((unsigned long)old_end&pagemask)== 0)'失败.中止
有问题的一行是:
int *mult(int size, int *a, int *b) {
int *out,i, j, *tmp1, *tmp2, *tmp3, *tmpa1, *tmpa2, *tmpb1, *tmpb2,d, *res1, *res2;
fprintf(stdout, "size: %d\n", size);
out = (int *)malloc(sizeof(int) * size * 2);
}
Run Code Online (Sandbox Code Playgroud)
我用a检查了大小fprintf,它是一个正整数(此时通常为50).我尝试malloc用普通号码打电话,但我仍然得到错误.我只是对正在发生的事情感到难过,到目前为止我发现的谷歌没有任何帮助.
有什么想法发生了什么?我正在试图弄清楚如何编译一个更新的GCC,如果它是编译器错误,但我真的怀疑它.
我已经分配了一个像这样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代码:
int *a;
size_t size = 2000*sizeof(int);
a = (int *) malloc(size);
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.但如果我有以下内容:
char **b = malloc(2000*sizeof *b);
Run Code Online (Sandbox Code Playgroud)
每个元素b都有不同的长度.
怎么可能b像我一样做同样的事情a; 即以下代码是否正确?
char *c;
size_t size = 2000*sizeof(char *);
c = (char *) malloc(size);
Run Code Online (Sandbox Code Playgroud) 我正在尝试学习C而我正在尝试编写一个基本的堆栈数据结构,但我似乎无法获得基本malloc/ free正确.
这是我一直在使用的代码(我只是在这里发布一小部分来说明一个特定的问题,而不是总代码,但错误消息是通过运行此示例代码生成的valgrind)
#include <stdio.h>
#include <stdlib.h>
typedef struct Entry {
struct Entry *previous;
int value;
} Entry;
void destroyEntry(Entry entry);
int main(int argc, char *argv[])
{
Entry* apple;
apple = malloc(sizeof(Entry));
destroyEntry(*(apple));
return 0;
}
void destroyEntry(Entry entry)
{
Entry *entry_ptr = &entry;
free(entry_ptr);
return;
}
Run Code Online (Sandbox Code Playgroud)
当我运行它valgrind时--leak-check=full --track-origins=yes,我收到以下错误:
==20674== Invalid free() / delete / delete[] / realloc()
==20674== at 0x4028E58: free (vg_replace_malloc.c:427)
==20674== by 0x80485B2: destroyEntry (testing.c:53)
==20674== by 0x8048477: …Run Code Online (Sandbox Code Playgroud) 令人惊讶的简单/愚蠢/基本问题,但我不知道:假设我想让我的函数的用户返回一个C字符串,其长度我不知道在函数的开头.我可以在开始时仅在长度上放置上限,并且根据处理,尺寸可能缩小.
问题是,分配足够的堆空间(上限)然后在处理期间终止字符串是否有任何问题?即如果我在分配的内存中间插入'\ 0',(a.)是否free()仍能正常工作,并且(b.)'\ 0'之后的空格变得无关紧要?一旦'\ 0'被添加,内存是否会被返回,或者它是否位于占用空间直到free()被调用?将这个悬空空间留在那里通常是不好的编程风格,为了节省一些前期编程时间,在调用malloc之前计算必要的空间?
为了给出这个上下文,假设我想删除连续的重复项,如下所示:
输入"你好oOOOo !!" - >输出"Helo oOo!"
...以及下面的一些代码显示了我如何预先计算操作产生的大小,有效地执行两次处理以使堆大小正确.
char* RemoveChains(const char* str)
{
if (str == NULL) {
return NULL;
}
if (strlen(str) == 0) {
char* outstr = (char*)malloc(1);
*outstr = '\0';
return outstr;
}
const char* original = str; // for reuse
char prev = *str++; // [prev][str][str+1]...
unsigned int outlen = 1; // first char auto-counted
// Determine length necessary by mimicking processing
while (*str) {
if (*str != …Run Code Online (Sandbox Code Playgroud) Firefox 3附带了一个新的分配器:jemalloc.
我在几个地方听说过这个新的分配器更好.谷歌的最高结果虽然没有提供任何进一步的信息,但我对其运作方式感兴趣.
我需要帮助malloc() 内部另一个功能.
我正在向我的函数传递一个指针和大小main(),我想malloc()从被调用的函数内部动态地为该指针分配内存,但我看到的是......正在分配的内存是对于在我调用的函数内声明的指针,而不是指向内部的指针main().
我应该如何传递指向函数的指针并为被调用函数内部传递的指针分配内存?
我写了下面的代码,得到如下所示的输出.
资源:
int main()
{
unsigned char *input_image;
unsigned int bmp_image_size = 262144;
if(alloc_pixels(input_image, bmp_image_size)==NULL)
printf("\nPoint2: Memory allocated: %d bytes",_msize(input_image));
else
printf("\nPoint3: Memory not allocated");
return 0;
}
signed char alloc_pixels(unsigned char *ptr, unsigned int size)
{
signed char status = NO_ERROR;
ptr = NULL;
ptr = (unsigned char*)malloc(size);
if(ptr== NULL)
{
status = ERROR;
free(ptr);
printf("\nERROR: Memory allocation did not complete successfully!"); …Run Code Online (Sandbox Code Playgroud) 今天我用一些C代码帮助我的一个朋友,我发现了一些奇怪的行为,我无法解释他为什么会发生这种行为.我们有一个带有整数列表的TSV文件,每行都有一个int.第一行是列表的行数.
我们还有一个非常简单的"readfile"的ac文件.第一行读到n,行数,然后有一个初始化:
int list[n]
Run Code Online (Sandbox Code Playgroud)
最后是一个带有fscanf的n循环.
对于小n(直到~100,000),一切都很好.但是,我们发现当n很大(10 ^ 6)时,会发生段错误.
最后,我们将列表初始化更改为
int *list = malloc(n*sizeof(int))
Run Code Online (Sandbox Code Playgroud)
一切都很好,即使是非常大的n.
有人能解释为什么会这样吗?什么导致了segfault [n]的段错误,当我们开始使用list = malloc(n*sizeof(int))时停止了?