在开始之前,我知道有很多关于此的问题,我希望我的问题不是多余的。我在网上看了很多东西,我有一个具体的问题。用C语言分配内存时,分配内存的最佳方法是什么。
想象一下,我想分配一个int* nb
,那么有更好的方法来分配内存吗?
我读过第一个解决方案:
nb=malloc(sizeof *nb);
我读过的第二个解决方案:
nb=malloc(sizeof(nb));
我读过第三个解决方案:
nb=malloc(sizeof(int*));
我之所以这样问是因为我已经在互联网上阅读了这三种解决方案,如果我理解的话,分配大小可能因您所使用的系统而异,所以使用{{1}的原因},可能会分配比sizeof(nb)
更多的内存。我错了吗?
[编辑]
这里的目标主要是分配一个任意大小的数组
[/编辑]
再次感谢您的帮助,希望我的问题不是多余的
答案 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
。