我写了下面的示例程序,但它崩溃与段错误。 问题似乎是在结构中使用malloc和std::string s。 #include <iostream> #include <string> #include <cstdlib> struct example { std::string data; }; int main() { example *ex = (example *)malloc(sizeof(*ex)); ex->data = "hello world"; std::cout << ex->data << std::endl; } 我无法弄清楚如何使它工作。 任何想法,如果甚至可以使用malloc()和std::string s? 谢谢,Boda Cydo。
malloc(0)返回什么? 答案是一样的realloc(malloc(0),0) ? #include<stdio.h> #include<malloc.h> int main() { printf("%p\n", malloc(0)); printf("%p\n", realloc(malloc(0), 0)); return 0; } 从linux gcc输出: manav@manav-workstation:~$ gcc -Wall mal.c manav@manav-workstation:~$ ./a.out 0x9363008 (nil) manav@manav-workstation:~$ 输出保持每次malloc(0) 。 这是一个标准答案吗? 除了学术研究之外,为什么有人有兴趣得到这样一个指针呢? 编辑: 如果malloc(0)返回虚拟指针,那么如何工作: int main() { void *ptr = malloc(0); printf("%p\n", realloc(ptr, 1024)); return 0; } 编辑: 以下代码为每个迭代输出“可能”。 为什么它不会失败? #include<stdio.h> #include<malloc.h> int main() { int […]
我试图弄清楚我的机器(1GB内存160GB高清Windows平台)可以最大限度地使用malloc。 我读了malloc可以分配的最大内存限于物理内存(在堆上)。 另外,当一个程序超过内存消耗到一定程度,计算机停止工作,因为其他应用程序没有得到足够的内存,他们需要。 所以要确认一下,我用C写了一个小程序: int main(){ int *p; while(1){ p=(int *)malloc(4); if(!p)break; } } 我希望有一段时间,内存分配将失败,循环会中断,但我的电脑挂起,因为它是一个无限循环。 我等了大约一个小时,最后我不得不强行closures我的电脑。 一些问题: malloc是否也从HD分配内存? 上述行为的原因是什么? 为什么在任何时候都没有循环rest? 为什么没有分配失败?
今天我用一些C代码帮助我的一个朋友,我发现了一些奇怪的行为,我无法解释他为什么会这样。 我们有一个整数列表TSV文件,每行一个int。 第一行是列表中的行数。 我们也有一个非常简单的“读取文件”的交stream文件。 第一行读到n,行数,然后有一个初始化: int list[n] 最后是一个fscanf的for循环。 对于小n(直到100.000),一切都很好。 然而,我们发现当n很大时(10 ^ 6),会发生段错误。 最后,我们将列表初始化更改为 int *list = malloc(n*sizeof(int)) 一切都好,即使是非常大的n。 有人可以解释为什么会发生? 是什么导致segfault与int list [n],当我们开始使用list = malloc(n * sizeof(int))时停止?
我想用C程序读取用户的input。 我不想使用数组, char names[50]; 因为如果用户给出长度为10的string,则剩余空间被浪费。 如果我使用字符指针, char *names; 那么我需要为此分配内存, names = (char *)malloc(20 * sizeof(char)); 在这种情况下,也有内存浪费的可能性。 所以,我需要的是dynamic分配一个与string长度完全相同的string的内存。 让我们假设, 如果用户input是"stackoverflow" ,那么分配的内存应该是14 (即string的长度= 13,'\ 0'有1个额外的空间)。 我怎么能做到这一点?
任何人都可以解释如何malloc()内部工作? 我有时做strace program ,我看到很多sbrk系统调用,做man sbrk谈论它在malloc()使用,但没有更多。
我试图写一个简单的共享库,可以将malloc调用logging到stderr(如果愿意的话,可以使用一种“mtrace”)。 但是,这是行不通的。 这就是我所做的: /* mtrace.c */ #include <dlfcn.h> #include <stdio.h> static void* (*real_malloc)(size_t); void *malloc(size_t size) { void *p = NULL; fprintf(stderr, "malloc(%d) = ", size); p = real_malloc(size); fprintf(stderr, "%p\n", p); return p; } static void __mtrace_init(void) __attribute__((constructor)); static void __mtrace_init(void) { void *handle = NULL; handle = dlopen("libc.so.6", RTLD_LAZY); if (NULL == handle) […]
嗨,我试图创build免费的包装函数和C中的malloc来帮助通知我的内存泄漏。 有没有人知道如何声明这些函数,所以当我调用malloc()和free()它会调用我的自定义函数,而不是标准的lib函数?
我有一个长期生活的应用程序与频繁的内存分配 – 释放。 任何malloc实现返回将内存释放回系统? 在这方面,什么是这样的行为: ptmalloc 1,2(glibc默认)或3 dlmalloc tcmalloc(谷歌线程malloc) solaris 10-11默认的malloc和mtmalloc FreeBSD 8默认的malloc(jemalloc) 囤地malloc? 更新 如果我的应用程序的内存消耗在白天和夜晚可能会非常不同(例如),我可以强制任何malloc将释放的内存返回给系统吗? 没有这样的返回释放内存将被换出,并在很多时候,但这样的内存只包含垃圾。
malloc()函数是否可重入?