char *str;
str = malloc(sizeof(char) * 5);
这段代码将 5 个连续的内存插槽分配给变量str
,其类型为char *
。
char *str;
str = malloc(sizeof(char *) * 5);
这应该分配 char 数组内存的 5 倍。但是,由于 char 数组在我们声明它之前没有大小,那么这个语句实际上有什么作用?
对于第一部分
此代码将 5 个"连续内存插槽"分配给变量
str
,其类型为char *
。
不,不是真的。确切地说,如果成功,它会返回一个指向足够大的内存块的指针,以容纳 5char
秒,这是提供给malloc()
的大小。在C
中,sizeof(char)
保证是1
的,所以是5个字节。
相关,C11
, 章节 §7.22.3.4
malloc()
函数为大小由size
和 其价值是不确定的。
因此,没有这样的"连续块",它是一个具有指定大小的内存区域("一个"对象的空间)。
在后面的情况下,大小是char *
,一个指针。 根据您的环境,字节量将5 * sizeof (char *)
,其中sizeof(char *)
可以是 4 或 8 或其他任何值。
请注意,这两种情况,返回的指针都是void *
类型。
另请注意这一点
用于在参数中提供大小malloc()
数据类型对返回的指针没有附加或影响,它仅用于计算要传递给malloc()
的size
。
例如,如果碰巧对于某个平台,sizeof(int)
===sizeof(float)
,那么,我们可以写
int *intPtr = malloc(sizeof *fltPtr); //int pointer
float *fltPtr = malloc(sizeof *intPtr); // float pointer
考虑到成功,我们可以完美地利用这两个指针。
以下代码
char **str = malloc(sizeof(char *) * 5);
为 5 个连续的char *
类型元素分配内存,即:指向字符的指针。
然后,您可以分配N个连续的char
元素,并将其地址分配给以下指针:
for (int i = 0; i < 5; i++)
str[i] = malloc(sizeof(char) * N));
char *str;
str = malloc(sizeof(char *) * 5);
它分配足够的内存来存储 5 个指向 char 的指针(5 个地址)。它不是分配内存来存储数组,而只是分配它们的地址
第二部分实际上分配了 5 次 char 指针,而不是数组。
// main.c
#include <stdio.h>
int main()
{
printf("%un", sizeof(char *));
}
如果在 32 位环境中编译上述代码,此代码将打印 4。在 64 位环境中,此代码将打印 8。(您可以按照下面如何测试中所述的步骤在 64 位环境中自行测试。
因此,根据您的环境,char *str = malloc(sizeof(char *) * 5);
分配20
或40
字节的内存,这些内存由str
.因此,如果您打算在str
中存储 c 类型字符串,您将能够存储19
或39
字符。
如何测试
我使用的是64 位Ubuntu 14.04。在 64 位环境中,您可以使用以下编译器选项测试上述示例代码。
$ gcc -m32 -o out32 main.c
$ ./out32
4
$ gcc -o out64 main.c
$ ./out64
8
如果您收到错误消息说sys/cdefs.h: No such file or directory
请安装以下包。
$ sudo apt install libx32gcc-4.8-dev
$ sudo apt install libc6-dev-i386
(从本文中获得了必需的包装名称)