【问题标题】:dynamic memory allocation for double pointer takes size as one but can hold a string more than a byte.how is this possible?双指针的动态内存分配以大小为一个,但可以容纳一个多于一个字节的字符串。这怎么可能?
【发布时间】:2016-11-11 01:56:17
【问题描述】:

你能解释一下如何分配下面的内存来保存这么大的字符串,即使我给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]);

我很困惑它是如何工作的。

【问题讨论】:

  • 您没有分配 1 个字节。您正在分配一个指针 - 可能是 4 或 8 个字节。然后将它分配给其他地方已经存在的 const 字符串。
  • 为什么你认为malloc() 会分配“只​​分配一个字节”?
  • “为什么这个明显无效的程序会起作用?”一般来说,这种问题是没有成效的。阅读“未定义的行为”。 (此特定程序可能无效,也可能无效)。
  • str[0] = "This is a string"; 不制作物理副本。复制使用函数strcpy(...).

标签: c string dynamic-memory-allocation double-pointer arrayofstring


【解决方案1】:

你没有分配你认为你正在分配的东西。

当你说

char **str;

这不是一个可以容纳一个字符串的变量。这是一个可以保存多个字符串数组的变量。

当你说

int len = 1;
str = malloc(sizeof(char*) * len);

您将str 设置为最多容纳一个字符串。也就是说,在这种情况下,len 计算的是字符串的数量,而不是字符串的长度。

那么当你说

str[0] = "This is a string";

您正在用指向字符串常量的指针填充str 的一个字符串。编译器为您分配了字符串常量的内存,因此您不必这样做。在这种情况下,您所做的就是复制指针。您没有复制整个字符串,因此您不必为它分配更多内存。就像你刚才说的那样

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.";

【讨论】:

    【解决方案2】:

    你没有分配一个字节。

    表达式sizeof(char*)*len可以简化为sizeof (char *),即字符指针的大小。这通常是 4 或 8。

    然后你只需在其中存储一个指针,字符串文字 "This is a string" 的值就是该文字出现在内存中的地址,所以这样:

    str[0] = "This is a string";
    

    只对str[0](它是一个指针)进行一个指针大小的赋值,不会复制任何字符。一个指针就是你分配了多少空间,所以一切都很顺利。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 2023-03-06
      • 2015-01-03
      • 2021-10-11
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      相关资源
      最近更新 更多