50得票4回答
为什么C++中的malloc()需要强制类型转换而C语言不需要?

我一直对这个问题很好奇 - 为什么在C++中,我必须强制转换来自malloc的返回值,但在C中不需要? 以下是在C++中有效的示例:int *int_ptr = (int *)malloc(sizeof(int*)); 以下是不使用强制转换的 C++ 示例,但无法正常工作:int *int_...

50得票9回答
如果free()知道我的数组的长度,为什么我不能在自己的代码中询问它?

我知道传递动态分配数组长度给操作它们的函数是一种常见的惯例:void initializeAndFree(int* anArray, size_t length); int main(){ size_t arrayLength = 0; scanf("%d", &ar...

47得票4回答
使用指向一次性分配内存的指针是明确定义的吗?

在C语言中,可以创建一个指针,使其指向数组最后一个元素的下一个位置,并在指针算术运算中使用它,只要你不对其进行解引用操作就可以。int a[5], *p = a+5, diff = p-a; // Well-defined 然而,这些是未定义行为:p = a+6; int b = *(a+5)...

45得票10回答
在C语言中创建malloc和free的包装函数

我正在尝试为C语言中的free和malloc创建包装函数,以帮助我检测内存泄漏。有人知道如何声明这些函数,以便在调用malloc()和free()时调用我的自定义函数而不是标准库函数吗?

44得票2回答
如果`malloc(0)`返回一个非空指针,我可以把它传递给`free`吗?

我一直在阅读有关malloc在请求零大小的块时如何行为的讨论。 我了解到malloc(0)的行为是实现定义的,它应该返回一个空指针或者一个非空指针,但我仍然不应该去访问它。这很有道理,因为没有保证它指向任何可用的内存。 然而,如果我得到了这样一个不可访问的非空指针,我是否可以像通常一样将其...

43得票5回答
退出前我应该释放内存吗?

如果我因为错误而退出程序,是否应该释放所有已分配的内存?something = (char**) malloc (x * sizeof(char*)); for (i = 0; i < x; i++) something[i] = (char*) malloc (y + 1); ...

43得票10回答
你能在C或C++中分配一个非常大的单一内存块(> 4GB)吗?

现在有很大的内存,我想知道是否可能分配一个大于4GB的单一内存块?还是需要分配多个较小的内存块并处理它们之间的切换? 为什么呢? 我正在处理一些openstreetmap xml数据,这些文件非常大。由于无法一次性加载所有数据,所以我目前正在使用流式传输方式,但我对malloc或new的上限...

43得票5回答
正确释放多维数组的内存(C语言)

假设你有以下 ANSI C 代码,用于初始化一个多维数组:int main() { int i, m = 5, n = 20; int **a = malloc(m * sizeof(int *)); //Initialize the arrays ...

43得票4回答
具体来说,fork()在Linux中如何处理由malloc()动态分配的内存?

我有一个有父进程和子进程的程序。在fork()之前,父进程调用了malloc()并用一些数据填充了一个数组。在fork()之后,子进程需要这些数据。我知道可以使用管道,但是以下代码似乎也能工作:#include <stdio.h> #include <stdlib.h>...

43得票8回答
动态内存分配和构造函数

与new和delete表达式不同,当为对象分配内存时,std::malloc不会调用构造函数。在这种情况下,我们应该如何创建一个对象,以便也能调用构造函数呢?