我在Linux环境中使用C编程语言来读取目录中的文件。 我在我的代码中包含#include<dirent.h> ,并使用函数readdir() 。 根据在线的Linux页面,它说,不要在生成指向dirent结构的指针上调用free() ,因为它可能被分配在堆栈上。 你能帮我理解这是如何工作的吗? 我不明白为什么我们不必删除struct dirent 。 何时删除,谁删除? 这里是我正在谈论的摘录: readdir()成功时返回一个指向dirent结构的指针。 (这个结构可能是静态分配的;不要试图free(3)它free(3) )如果到达目录stream的末尾,返回NULL ,并且errno没有改变。 如果发生错误,则返回NULL ,并适当地errno 。
请告诉我关于下面的代码堆栈和堆之间的区别 int main() { int arr[3]; int *a; arr [5] = 6; // out of bound but it will not give error. arr [3000] = 8 ; //SIGSEGV a = malloc (sizeof (int)); a[4] = 6; a[4000] = 8; //No error } 我知道,ARR是一个静态数组,我正在访问一些其他进程的地址,当我做ARR [3000]给SIGSEGV错误。 但我不明白为什么[4000]不会给我任何运行时错误,即SIGSEGV信号。 谢谢
我想了解glibc中的malloc实现是如何工作的。 根据malloc的源代码(glibc 2.23中的malloc.c),空闲内存块具有以下结构。 chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Size of previous chunk | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ `head:' | Size of chunk, in bytes |P| mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Forward pointer to next chunk in list | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Back pointer to previous chunk in list | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Unused space (may be 0 bytes long) . . . . | […]
考虑下面的程序: #include <sys/mman.h> #include <stdlib.h> #include <errno.h> int main() { errno = 0; mlockall(MCL_FUTURE); char *a = malloc(1); if (!a) exit(errno); munlockall(); exit(0); } 作为普通用户运行时,我得到: ~ ./a.out ~ echo $? 11 从/usr/include/asm-generic/errno-base.h : #define EAGAIN 11 /* Try again */ 以root身份运行时或传递MCL_FUTURE | MCL_CURRENT MCL_FUTURE | MCL_CURRENT它运行成功。 我认为权限不够或标志错误,但是EPERM和EINVAL都没有被返回。 这个错误在这两个函数的手册页中都没有指定,在mlockall的POSIX规范中也没有指定。 mlockall之后放置一个printf显示它是设置errno的malloc。 更奇怪的是,malloc似乎并没有设置EAGAIN(或者我正在寻找错误的地方): /usr/src/glibc/glibc-2.19/malloc grep -r . -e […]
我目前正在做的一些程序比我想象的要消耗更多的内存。 所以我想了解如何glibc malloc修剪工作。 我写了下面的testing: #include <malloc.h> #include <unistd.h> #define NUM_CHUNKS 1000000 #define CHUNCK_SIZE 100 int main() { // disable fast bins mallopt(M_MXFAST, 0); void** array = (void**)malloc(sizeof(void*) * NUM_CHUNKS); // allocating memory for(unsigned int i = 0; i < NUM_CHUNKS; i++) { array[i] = malloc(CHUNCK_SIZE); } // releasing memory ALMOST all memory for(unsigned int i […]
我们可以在C中初始化一个像这样的字符指针 char *c="test"; c指向第一个字符(t)。 但是当我给下面的代码。 它给分段错误。 #include<stdio.h> #include<stdlib.h> main() { int *i=0; printf("%d",*i); } 另外当我给 #include<stdio.h> #include<stdlib.h> main() { int *i; i=(int *)malloc(2); *i=0; printf("%d",*i); } 它工作(给输出0)。 当我给malloc(0) ,它的工作(给输出0)。 请告诉发生了什么事
可能重复: 你可以分配一个非常大的内存单元(> 4GB)在C或C + +? 我正在计算机上运行以下程序: #include <stdio.h> #include <stdlib.h> #define ONE_GIGABYTE 1024*1024*1024 int main(void) { int ctr=0; for (;;) { char *ptr = (char*)malloc(ONE_GIGABYTE*sizeof(char)); if (ptr == 0) return -1; ctr++; printf("%d\n", ctr); } } flyrev@stargazer:~/weirdstuff$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 […]
我已经阅读过高级Unix编程(以及其他一些书),Linux malloc()使用Linux系统调用sbrk()从操作系统请求内存。 我正在看glibc malloc.c代码,我可以在注释中看到很多提到的sbrk() ,但是不直接在代码中提到。 当malloc()从操作系统请求内存时, sbrk()是如何引用/使用的? (这可能是我对C运行时库系统调用的一个普遍的误解,如果是这样的话,我想知道它们是如何做出来的?)
这可能是一个简单的问题,但我找不到答案。 malloc内部调用realloc内和calloc? 由于我不知何时数malloc电话,这对我很有趣。 谢谢
说我有一个应用程序的两个实例,具有相同的input和相同的执行顺序。 因此,一个实例是冗余实例,用于将内存中的数据与另一实例进行比较,作为一种错误检测机制。 现在,我希望所有内存分配和释放在两个进程中以完全相同的方式发生。 什么是最简单的方法来实现呢? 写我自己的malloc和免费的? 那么如何分配与其他function,如mmap的内存?