Tag: 内存管理

为什么NULL / 0是对象的非法内存位置?

我理解C / C ++中NULL常量的用途,我理解它需要在内部以某种方式表示。 我的问题是:对于C / C ++中的对象,0地址是否是无效的内存位置有一些根本原因吗? 或者我们理论上 “浪费”一个字节的内存由于这个保留?

如何将一个整数数组复制到另一个

复制整数数组的最佳方法是什么? 我知道memcpy()是一种方法。 有没有像strdup()这样的函数?

结构成员如何在内存中分配?

在尝试为未来的C程序创建内存管理器时,我遇到了这个问题: “当分配结构时,它们的成员字段是否按照指定的顺序存储?” 例如,请考虑以下结构。 typedef struct { int field1; int field2; char field3; } SomeType; 分配时,字段的内存地址是否在字段field1,field2,field3中? 或者这不保证?

Visual C ++运行时malloc / free会将内存返回给操作系统吗?

问题与Will malloc实现将free-ed内存返回系统有很多相似之处? ,但我对Windows / Microsoft Visual Studio的答案以及有关确切虚拟内存状态的详细信息感兴趣。 Visual C ++ CRT会自由地将内存返回给系统吗? 关于虚拟内存分配的内存的确切状态是什么? 在大内存块上释放后,块中的内存是否会被提交,保留或释放? 如果我在免费后拨打_heapmin怎么办?

对齐内存管理?

关于管理对齐的内存块,我有一些相关的问题。 跨平台的答案是理想的。 但是,由于我非常确定不存在跨平台解决方案,因此我主要对Windows和Linux以及(在很大程度上)Mac OS和FreeBSD感兴趣。 在16字节边界上对齐大块内存的最佳方法是什么? (我知道使用malloc()的简单方法,分配一些额外的空间,然后将指针碰到一个正确对齐的值。虽然我希望能找到一些不那么重要的东西。另外,请参阅以下是其他问题。) 如果我使用普通的旧malloc() ,分配额外的空间,然后将指针移动到正确对齐的位置,是否有必要将指针保持在块的开头以便释放? (在指向块中间的指针上调用free()似乎在Windows上实际运行,但我想知道标准是什么,即使标准说你不能,它是否在所有主要的实践中都有效操作系统。我不关心模糊的DS9K操作系统。) 这是一个艰难/有趣的部分 。 在保持对齐的同时重新分配内存块的最佳方法是什么? 理想情况下,这比调用malloc() ,复制,然后在旧块上调用free()更聪明。 我想尽可能在​​适当的地方做。

free()不解除内存?

free(str); printf(“%d\n”, str->listeners); 对printf的调用成功(对str的成员的任何其他调用也是如此)。 这怎么可能?

全局变量和局部变量的内存分配

我已经知道全局变量的内存是在程序启动时分配的,而局部变量的内存是在进行函数调用时分配的。 情况1: 我声明了一个大小为63500000的全局整数数组,使用的内存为256 MB Ideone Link include int a[63500000]; int main() { printf (“This code requires about 250 MB memory\n”); return 0; } 案例2: 我在main()中声明了一个大小相同的本地整数数组,使用的内存是1.6 MB Ideone链接 #include int main() { int a[63500000]= {1,5,0}; printf (“This code requires only 1.6 MB \n”); //printf (“%d\n”, a[0]); return 0; } 案例3: 我在另一个函数中声明了一个大小相同的本地整数数组,使用的内存是1.6 MB Ideone Link #include void […]

C:堆栈内存,转到和“跳转到具有可变修改类型的标识符范围”,

我发现这拒绝编译: int test_alloc_stack(int size){ if(0) goto error; // same issue whatever conditional is used int apply[size]; give_values(apply,size); return 1; error: return 0; } 我得到的错误是:“跳转到具有可变修改类型的标识符范围”。 使用“goto”消除行并跳转到错误可以解决问题。 如果我使用动态分配进行应用,那么问题也会消失。 编译好: int test_alloc_heap(int size){ if(0) goto error; int * apply = calloc(sizeof(int),size); give_values(apply,size); free(apply); return 1; error : return 0; } 到底是怎么回事 ?

堆,堆栈,文本等不同的段如何与物理内存相关?

编译C程序并创建目标文件(ELF)时。 目标文件包含不同的部分,如bss,数据,文本和其他段。 我知道ELF的这些部分是虚拟内存地址空间的一部分。 我对吗? 如果我错了,请纠正我。 此外,将存在与编译的程序相关联的虚拟存储器和页表。 页表在加载程序时将ELF中存在的虚拟内存地址与实际物理内存地址相关联。 我的理解是否正确? 我在创建的ELF文件中读到,bss部分只保留未初始化的全局变量的引用。 这里未初始化的全局变量是指在声明期间未初始化的变量? 另外,我读到局部变量将在运行时(即堆栈中)分配空间。 那么它们将如何在目标文件中引用? 如果在程序中,有特定的代码段可用于动态分配内存。 如何在目标文件中引用这些变量? 我很困惑,目标文件的这些不同段(如文本,rodata,数据,bss,堆栈和堆)是物理内存(RAM)的一部分,其中所有程序都被执行。 但我觉得我的理解是错误的。 当进程或程序执行时,这些不同的段如何与物理内存相关?

如何在C99中为隐式定义的多维数组分配内存?

我正在尝试编写一个C99程序,我有一个隐式定义的字符串数组: char *stuff[] = {“hello”,”pie”,”deadbeef”}; 由于未定义数组维度,因此为每个字符串分配了多少内存? 是否所有字符串都分配了与定义中最大字符串相同数量的元素? 例如,以下代码是否等同于上面的隐式定义: char stuff[3][9]; strcpy(stuff[0], “hello”); strcpy(stuff[1], “pie”); strcpy(stuff[2], “deadbeef”); 或者每个字符串只分配定义时所需的内存量(即stuff[0]包含6个元素的数组, stuff[1]包含4个元素的数组, stuff[2]包含一个数组9个元素)?