分配大小为char*的内存做什么?
此代码为变量分配大小为char*的内存做什么?,c,pointers,malloc,dynamic-memory-allocation,allocation,C,Pointers,Malloc,Dynamic Memory Allocation,Allocation,此代码为变量str分配5个连续的内存插槽,该变量的类型为char* char *str; str = malloc(sizeof(char) * 5); 这应该分配5倍于字符数组的内存。但是由于char数组在我们声明它之前没有大小,那么这个语句实际上做什么呢?对于第一部分 此代码为变量str分配5个“连续的内存插槽”,该变量的类型为char* char *str; str = malloc(sizeof(char) * 5); 不,不是真的。确切地说,如果成功,它将返回一个指向足
str
分配5个连续的内存插槽,该变量的类型为char*
char *str;
str = malloc(sizeof(char) * 5);
这应该分配5倍于字符数组的内存。但是由于char数组在我们声明它之前没有大小,那么这个语句实际上做什么呢?对于第一部分
此代码为变量str
分配5个“连续的内存插槽”,该变量的类型为char*
char *str;
str = malloc(sizeof(char) * 5);
不,不是真的。确切地说,如果成功,它将返回一个指向足够容纳5个char
s的内存块的指针,这是提供给malloc()
的大小。在C
中,sizeof(char)
保证为1
,即5个字节
相关,C11
,第§7.22.3.4章
malloc()
函数为大小由size
和指定的对象分配空间
其值是不确定的
因此,不存在“连续块”,它是具有指定大小的内存区域(“对象”的空间)
在后一种情况下,大小是指针char*
。根据您的环境,字节数将为5*sizeof(char*)
,其中sizeof(char*)
可以是4或8或任何其他值
注意在这两种情况下,返回的指针的类型都是void*
char *str;
str = malloc(sizeof(char) * 5);
还要注意这一点 用于在
malloc()
参数中提供大小的数据类型对返回的指针没有任何附加或影响,它仅用于计算要传递给malloc()
的大小
例如,如果对于某个平台,sizeof(int)
===sizeof(float)
,那么我们可以编写
char *str;
str = malloc(sizeof(char *) * 5);
考虑到成功,我们可以完美地利用这两个指针
int *intPtr = malloc(sizeof *fltPtr); //int pointer
float *fltPtr = malloc(sizeof *intPtr); // float pointer
它分配足够的内存来存储5个指向char的指针(5个地址)。它不是分配内存来存储数组,而是只分配它们的地址
char *str;
str = malloc(sizeof(char *) * 5);
为char*
类型的5个连续元素分配内存,即:指向char的指针
然后,您可以分配N个连续的char
类型的元素,并将它们的地址分配给这些指针:
char **str = malloc(sizeof(char *) * 5);
for(int i=0;i<5;i++)
str[i]=malloc(sizeof(char)*N);
第二部分实际上分配了5倍的char指针,而不是数组
for (int i = 0; i < 5; i++)
str[i] = malloc(sizeof(char) * N));
如果您收到错误信息,说sys/cdefs.h:没有这样的文件或目录
,请安装以下软件包
$ gcc -m32 -o out32 main.c
$ ./out32
4
$ gcc -o out64 main.c
$ ./out64
8
(从中获取所需的包名称)该*表示指针不是数组。它分配一个5个指向字符的指针块char*
本身就是一种数据类型(指向字符的指针),因此第二条语句分配一个内存块来存储5个字符指针。顺便说一句,在我的系统(Linux/x86-64)上sizeof(char*)
是8(与任何指针的大小一样),如果它令人困惑,请解释原因