c - 分配大小为 char * 的内存有什么作用?


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);分配2040字节的内存,这些内存由str.因此,如果您打算在str中存储 c 类型字符串,您将能够存储1939字符。

<小时 />

如何测试

我使用的是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

(从本文中获得了必需的包装名称)

相关内容

  • 没有找到相关文章

最新更新