动态内存分配最好的方法

时间:2014-05-27 07:06:03

标签: c memory allocation

在开始之前,我知道有很多关于此的问题,我希望我的问题不是多余的。我在网上看了很多东西,我有一个具体的问题。用C语言分配内存时,分配内存的最佳方法是什么。

想象一下,我想分配一个int* nb,那么有更好的方法来分配内存吗?

我读过第一个解决方案:

nb=malloc(sizeof *nb);

我读过的第二个解决方案:

nb=malloc(sizeof(nb));

我读过第三个解决方案:

nb=malloc(sizeof(int*));

我之所以这样问是因为我已经在互联网上阅读了这三种解决方案,如果我理解的话,分配大小可能因您所使用的系统而异,所以使用{{1}的原因},可能会分配比sizeof(nb)更多的内存。我错了吗?

[编辑]

这里的目标主要是分配一个任意大小的数组

[/编辑]

再次感谢您的帮助,希望我的问题不是多余的

3 个答案:

答案 0 :(得分:4)

int *IntPtr=NULL;
IntPtr=malloc(100*sizeof(int));

相同
int *IntPtr=NULL;
IntPtr=malloc(100*sizeof(*IntPtr));

因为IntPtr的类型为int*所以取消引用它(即* IntPtr)会导致类型int

另一方面:

nb=malloc(sizeof(nb)); 

是一个糟糕的选择,因为sizeof(nb)是指针本身的大小,即内存中地址的大小。在32位系统上,无论nb的类型是什么,它总是为4。

对于动态内存分配,您应该检查realloc

答案 1 :(得分:1)

第一种解决方案的优点是您可以在一个地方更改类型(例如从int* nb更改为double* nb),并且“malloc()”将自动更正为新类型和不需要修改。

第三种解决方案的优点是程序员有更多的视觉提示。例如。如果您看到nb=malloc(sizeof(int));,则无需找到nb的类型来确定其分配的内容。

理论上;这是首选取决于背景(当时哪个优势更重要),前者更可能更好。在实践中,我习惯于总是做后者,然后对编译器的类型检查未检测到错误感到失望。 : - )

答案 2 :(得分:0)

1)通常,我们声明并静态分配int变量,如下所示:
int nb;

2)如果我们想创建一个数组或由于某些原因,我们可以声明一个动态可分配的变量(一个指针):
int* nb;

在情况2)中,我们需要为声明的变量分配一个内存块:
nb = (int*) malloc( sizeof(*nb) );

对于单int存储,我们使用sizeof(int)sizeof(*nb)

由于nb是指向int的指针,typeof(*nb)int