Tag: malloc

何时在C中使用可变长度数组,但是在动态分配时?

我在C99中找到了可变长度数组,但看起来它的行为与malloc + free几乎相同。 我找到的实际差异: 太大的arrays处理: unsigned size = 4000000000; int* ptr = malloc(size); // ptr is 0, program doesn’t crash int array[size]; // segmentation fault, program crashes 内存泄漏:只能在动态数组分配中使用: int* ptr = malloc(size); … if(…) return; … free(ptr); 对象的生命和从函数返回的可能性:动态分配的数组生命直到内存被释放,并且可以从分配内存的函数返回。 resize:仅使用指向已分配内存的指针resize。 我的问题是: 有什么更多的差异(我对实用建议感兴趣)? 程序员可以使用两种具有可变长度的数组的方式有什么问题? 何时选择VLA但是在动态arrays分配时? 什么是更快:VLA或malloc +免费?

c ++:本地数组定义与malloc调用

这有什么区别: somefunction() { … char *output; output = (char *) malloc((len * 2) + 1); … } 还有这个: somefunction() { … char output[(len * 2) + 1]; … } 什么时候比另一个更合适? 谢谢大家的回答。 这是一个总结: 恩。 1是堆分配 恩。 2是堆栈分配 堆栈有一个大小限制,用于较小的分配 你必须释放堆分配,否则它会泄漏 一旦函数退出,就无法访​​问堆栈分配 在您释放堆分配(或应用程序结束)之前,可以访问堆分配 VLA不是标准C ++的一部分 更正欢迎。 这里有一些关于堆与堆栈之间差异的解释: 堆栈和堆的内容和位置是什么?

为外部dll上的缓冲区分配内存并在主应用程序上使用它是否安全?

正如在主题中..我在一个应用程序中找到了类似的东西。 在主C应用程序中我们有声明: void* buff = NULL; 后来有一个电话: ReadData(&buff); SaveToFile(buff); SaveToFile()是main函数的C函数。 ReadData(void* * )是来自外部dll的C ++函数。 在此函数中,缓冲区的内存由malloc函数分配并归档数据。 所以这是我的问题:这是正确的吗?

在C中创建自己的malloc函数

我需要你的帮助。 我对C有一般的了解,这就是问题所在。 我将使用一些基准来测试新处理器上的一些计算机体系结构(分支未命中,缓存未命中)。 关于它的事情是基准测试在C中,但我不能包含任何库调用。 例如,我不能使用malloc因为我收到了错误 “undefined reference to malloc” 即使我已经包括了图书馆。 所以我必须编写自己的malloc。 我不希望它超级高效 – 只做基础知识。 正如我在想的那样,我必须在内存中有一个地址,并且每当malloc发生时,我都会返回一个指向该地址的指针并按该大小递增计数器。 Malloc在我的程序中发生了两次,所以我甚至不需要大内存。 你可以帮帮我吗? 我设计了一个Verilog并且在C中没有那么多经验。 我见过以前的答案,但对我来说似乎都太复杂了。 此外,我无法访问KR书。 干杯! 编辑:也许这可以帮助你更多:我不是使用gcc而是使用sde-gcc编译器。 这有什么不同吗? 也许这就是为什么我得到一个未定义的malloc引用? EDIT2:我正在测试MIPS架构: 我包括: #include 而错误是: undefined reference to malloc relocation truncated to fit: R_MIPS_26 against malloc 和编译器命令id: test.o: test.c cap.h sde-gcc -c -o test.s test.c -EB -march=mips64 -mabi=64 -G -O -ggdb -O2 […]

是否有必要对malloc和calloc进行类型转换

可能重复: 我是否施放了malloc的结果? 我在Google上搜索找出malloc和calloc的类型转换的原因。 但是,我只发现malloc的类型转换是没有必要的,因为它返回void指针但是, calloc怎么样。 这也是calloc的原因??? 现在,如果我们回到第一点,关于malloc和calloc的返回值。 然后,我发现两者都返回分配的空格 。 所以,我在这里有点困惑。 所以,我的问题是 malloc和calloc的返回值是多少? 是否有必要输入malloc和calloc 。 为什么?

C中限制性最强的类型是什么意思?

“ C编程语言 ”一书在第8.7节“ 实例 – 存储分配器 ”中讨论了“限制性最强的类型”: 虽然机器各不相同,但对于每台机器都有一个限制性最强的类型:如果限制性最强的类型可以存储在特定地址,则所有其他类型也可以。 在某些机器上,限制最多的类型是double ; 在其他人, int或long就足够了。 在他们的代码中, union header使用long类型对齐。 限制性最强的是什么意思? 它可能是最大的类型(例如, double ),还是有另一种方法?

将内存分配给char * C语言

这是为char *分配内存的正确方法吗? char* sides =”5″; char* tempSides; tempSides = (char*)malloc(strlen(inSides) * sizeof(char));

如何限制使用`malloc()`获取的内存而不限制堆栈?

我试图阻止学生代码在分配时狂奔,并拖延我的测试机器。 我试过了 setrlimit(RLIMIT_DATA, r); 其中r是一个持有限制的结构。 但不幸的是,虽然这个限制阻止了brk和sbrk的分配,但C库只是故障转移到mmap并保持正确的分配。 我也试过了 setrlimit(RLIMIT_AS, r) 并且这会使进程停止,但是这种补救措施太严重了 – 进程无法从ENOMEM错误中恢复,因为代码在遇到malloc()返回的NULL值时所进行的调用没有堆栈空间。 我对二进制文件的控制有限,所以如果可以使用系统调用,我宁愿这样做。 但我需要一些方法来限制分配,而不会破坏流程的恢复能力。 有没有人有建议? 更新 :我找到了一个名为failmalloc的东西,但它并不是很复杂,虽然我可以使用它导致失败,但我总是得到gdb无法诊断的段错误。 进一步更新 :我发现setrlimit(RLIMIT_AS, r) 确实似乎完成了我想要的工作,至少在某些情况下 – 之后发生的段错误是由不相关模块中的错误引起的。 除非有人想出一些有趣的东西(或保留问题的理由),否则我可能会删除这个问题。

递归释放C结构

我有一个结构,只包含我已分配的内存指针。 有没有办法以递归方式释放每个指针而不是每个指针都自由的元素? 例如,假设我有这样的布局: typedef struct { … } vertex; typedef struct { … } normal; typedef struct { … } texture_coord; typedef struct { vertex* vertices; normal* normals; texture_coord* uv_coords; int* quads; int* triangles; } model; 在我的代码中我malloc每个结构创建一个模型: model* mdl = malloc (…); mdl->vertices = malloc (…); mdl->normals = malloc (…); mdl->uv_coords = malloc (…); mdl->quads […]

是什么让glibc malloc可以比较来自不同“对象”的指针?

比较指针与关系运算符(例如< , <= , >=或> )仅在指针指向同一聚合对象(结构,数组或联合)时由C标准定义。 这在实践中意味着形状的比较 if (start_object <= my_pointer && my_pointer < end_object+1) { 可以变成 if (1) { 通过优化编译器。 尽管如此,在K&R的第8.7节“示例 – 存储分配器”中,作者进行了与上述类似的比较。 他们原谅这个说法 然而,仍有一个假设是,可以有意义地比较sbrk返回的不同块的指针。 标准不保证这一点,它只允许在数组中进行指针比较。 因此,这个版本的malloc只能在一般指针比较有意义的机器之间移植。 而且,看来glibc中使用的malloc的实现做了同样的事情! 更糟糕的是 – 我偶然发现这一点的原因是 – 对于学校作业,我应该实现一个基本的类似function,并且作业的指示要求我们使用K&R代码,但我们必须更换通过调用mmap调用sbrk ! 虽然比较来自不同sbrk调用的指针可能是未定义的,但它也只是略微可疑,因为你有某种心理直觉,返回的指针应该来自同一个内存区域。 根据我的理解,由不同的mmap调用返回的指针甚至不能保证彼此远程相似,并且在mmap调用之间合并/合并内存块应该是非常非法的(并且看起来glibc避免了这种情况,只采用合并由sbrk或mmap页面内部返回的内存,而不是它们之间的内存),但是赋值需要这样。 问题:有人可以发光 是否可以优化将来自不同调用的指针与sbrk进行比较 如果是这样, glibc做什么让他们逃脱它。