你能解释一下如何分配下面的内存来保存这么大的字符串,即使我给出的大小malloc
只有一个字节
char **str;
int len = 1;
str = malloc(sizeof(char*)*len);//wont this allocate only one byte in heap?
str[0] = "This is a string";//this is more than one byte
printf("%s",str[0]);
我很困惑它是如何工作的。
你能解释一下如何分配下面的内存来保存这么大的字符串,即使我给出的大小malloc
只有一个字节
char **str;
int len = 1;
str = malloc(sizeof(char*)*len);//wont this allocate only one byte in heap?
str[0] = "This is a string";//this is more than one byte
printf("%s",str[0]);
我很困惑它是如何工作的。
您没有分配一个字节。
表达式sizeof(char*)*len
可以简化为sizeof (char *)
,即字符指针的大小。这通常是 4 或 8。
然后你只需在那里存储一个指针,字符串文字的值"This is a string"
是该文字出现在内存中的地址,所以:
str[0] = "This is a string";
只是对str[0]
(这是一个指针)进行单个指针大小的分配,不会复制任何字符。确切地说,一个指针就是您分配了多少空间,所以一切都很好。
你没有分配你认为你正在分配的东西。
当你说
char **str;
这不是一个可以容纳一个字符串的变量。这是一个可以保存多个字符串数组的变量。
当你说
int len = 1;
str = malloc(sizeof(char*) * len);
您正在设置str
以容纳一个字符串。也就是说,在这种情况下,len
计算字符串的数量,而不是字符串的长度。
然后当你说
str[0] = "This is a string";
您正在str
用指向字符串常量的指针填充 's 一个字符串。编译器为您分配了字符串常量的内存,因此您不必这样做。在这种情况下,您所做的就是复制指针。您没有复制整个字符串,因此您不必为它分配更多内存。就像你刚才说的那样
char *p;
p = "This is a string";
如果您想为整个字符串分配内存,并实际复制整个字符串,它可能如下所示:
const char *string_to_copy = "This is a string";
str[0] = malloc(strlen(string_to_copy) + 1); /* +1 for \0 */
if(str[0] == NULL) exit(1);
strcpy(str[0], string_to_copy);
如果你想用来str
保存多个字符串,它可能看起来像这样:
len = 4;
str = malloc(sizeof(char*) * len);
if(str == NULL) exit(1);
str[0] = "This";
str[1] = "is";
str[2] = "a";
str[3] = "test.";