c - 双指针的动态内存分配将大小作为一个,但可以容纳一个超过一个字节的字符串。这怎么可能?

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

你能解释一下下面的内存是如何分配来容纳这么大的字符串的吗,即使我给 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](它是一个指针)进行单个指针大小的赋值,不复制任何字符。一个指针就是您分配了多少空间,所以一切都很好。

关于c - 双指针的动态内存分配将大小作为一个,但可以容纳一个超过一个字节的字符串。这怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38267641/

相关文章:

c - 静态变量是自动线程局部的吗?

c - 使用 realloc 调整(减少)char 数组的大小并检查是否成功

c - 使用 fgets() 从文件中读取多行并存储到指针数组

python - 测试一个字符串的子字符串

c++ - 为什么 bool 到 string 的隐式转换不是错误?

c++ - 包含字符串值的结构在使用动态内存分配创建后在分配时导致段错误

c - 尝试连接二维数组的元素时出现段错误

c++ - 为什么我不能在 C++ 中用 new 调用参数化构造函数?

c - 斐波那契数列和 c 的问题

string - Swift 是否支持字符串 block ?