有人可以向我解释为什么我对字符串大小为6的malloc的调用返回4字节的sizeof?事实上,我给malloc的任何整数参数我得到sizeof为4.接下来,我试图复制两个字符串.为什么我复制的字符串输出(NULL)?以下是我的代码:
int main()
{
char * str = "string";
char * copy = malloc(sizeof(str) + 1);
printf("bytes allocated for copy: %d\n", sizeof(copy));
while(*str != '\0'){
*copy = *str;
str++;
copy++;
}
copy = '\0';
printf("%s\n", copy);
}
Run Code Online (Sandbox Code Playgroud)
Ara*_*raK 18
sizeof(str)返回类型指针的大小char*.你应该做的是malloc它自己的字符串的大小:
char * copy = malloc(strlen(str) + 1);
Run Code Online (Sandbox Code Playgroud)
另外,这些行:
while(*str != '\0'){
*copy = *str;
str++;
copy++;
}
copy = '\0';
Run Code Online (Sandbox Code Playgroud)
可以像这样在C中轻松地重写:
while(*copy++ = *str++);
Run Code Online (Sandbox Code Playgroud)
首先,您应该了解sizeof (xxx)(其中 xxx 是任何左值表达式(变量))始终等效于 do sizeof(xxx 的类型)。因此,你的sizeof (str)真正做的是返回 char * 的大小,即任何其他指针的大小。在 32 位架构上,您将获得 4 个,在 64 位架构上,您将获得 8 个,依此类推。
因此,正如其他人也解释的那样,您必须知道要分配的字符串的长度,然后添加 1 来存储终端 \0,C 隐式地用于放置在字符串的末尾。
但要做你想做的事(复制字符串并分配必要的空间),使用strdup会更简单、更高效,它正是这样做的:malloc和strcopy。
您也不应该忘记释放自己分配的空间(使用 malloc、calloc、strdup 或任何其他分配函数)。在 C 中,当分配的变量超出范围时,它不会消失。它将一直使用到计划结束。这就是你所说的内存泄漏。
#include <string.h> /* for strdup, strlen */
#include <stdio.h> /* for printf */
int main()
{
char * str = "string";
char * copy = strdup(str);
printf("bytes at least allocated for copy: %d\n", strlen(copy)+1);
printf("%s\n", copy);
free(copy);
}
Run Code Online (Sandbox Code Playgroud)
最后一点:我将消息更改为至少分配的字节,因为您并不真正知道调用 malloc 时分配的大小。它通常会分配比您要求的空间稍多的空间。一个原因是,在许多内存管理器中,空闲块使用某种隐藏的数据结构链接在一起,并且任何分配的块都应该能够至少包含这样的结构,另一个原因是分配的块总是以与任何类型兼容的方式对齐结盟。
希望它能帮助你更好地理解C。