【发布时间】:2018-01-23 03:41:51
【问题描述】:
我正在学习 C 编程,这是我的第一门编程课程。我对这段代码的 sn-p 遇到了一些问题:
int* intArray;
intArray=(int*)malloc(5*sizeof(int));
我相信数组中元素的数量是 5 个整数。但是,我不太了解的是 malloc 函数。在这种情况下,它是否为 5 个整数的地址分配了足够的内存?
【问题讨论】:
我正在学习 C 编程,这是我的第一门编程课程。我对这段代码的 sn-p 遇到了一些问题:
int* intArray;
intArray=(int*)malloc(5*sizeof(int));
我相信数组中元素的数量是 5 个整数。但是,我不太了解的是 malloc 函数。在这种情况下,它是否为 5 个整数的地址分配了足够的内存?
【问题讨论】:
Malloc 返回一个指向已分配空间的 void 指针,如果可用内存不足,则返回 NULL。参数是要分配的大小,以字节为单位。因此,在intArray = (int*)malloc(5*sizeof(int)); 行中,您请求为 5 个 int 分配内存足够(sizeof(int) 给出了 int 类型的大小)。 (malloc)
使用 malloc 请求分配足够用于 5 个新整数的内存。
【讨论】:
int 的大小因编译器而异。如果sizeof(int) 是 2 个字节,那么是的,它会分配 10 个字节并返回一个指向分配空间的指针。
不,malloc 为 5 个整数分配了足够的内存。它分配传递给函数的内容:5*sizeof(int)。你可能会感到困惑的是,intArray 是分配在堆栈上的指针,它指向 malloc'ed 内存开头的内存地址。
如果你想存储 5 个整数的地址,你可以这样做:
int** intArray;
intArray=(int**)malloc(5*sizeof(int*));
【讨论】:
malloc 函数分配您在参数中请求的字节数,并返回块开头的内存地址。在这种情况下,您请求的内存块足够大,可以容纳 5 个整数值。
您将其转换为int *,以便编译器在索引和取消引用时将地址作为包含整数来处理。
【讨论】:
如您所见,Malloc 函数调用需要一个指定字节数的值。来自 malloc 的文档:
void* malloc (size_t 大小);
分配内存块。分配一块大小字节的内存,返回一个指向块开头的指针。
新分配的内存块的内容没有初始化,剩余的值不确定。
因此,在您的代码 sn-p 中:
intArray=(int*)malloc(5*sizeof(int));
int 大小为 2 个字节。 sizeof(int) 返回 2。因此 5 * sizeof(int) = 10。因此,代码解析为 intArray = (int*)malloc(10);
【讨论】: