Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分配大小为char*的内存做什么?_C_Pointers_Malloc_Dynamic Memory Allocation_Allocation - Fatal编程技术网

分配大小为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(与任何指针的大小一样),如果它令人困惑,请解释原因