gpt4 book ai didi

c - 如何将 char *a[] 复制到 char **b?

转载 作者:太空宇宙 更新时间:2023-11-04 03:56:16 25 4
gpt4 key购买 nike

考虑 char *a[] = {"abc", "xyz", "def"};

深层复制 char *a[]char **b

有人能说说什么是深拷贝吗?我们需要为 b 分配多少内存?

最佳答案

char *a[n];

是 n 个指向字符的指针的数组。数组的每个元素在内存中都是连续的。所需内存大小为

sizeof(char *) * n

我在这里使用了 sizeof() 运算符...您可以假设一个指针为 4 个字节,但这可能不安全...这取决于您的硬件。

char **b

略有不同。这是一个指向 point-to-char 的指针。 **b 还没有分配指针数组。首先分配数组...

char **b = malloc( sizeof(char *) * n);

编辑:感谢 interjay 指出我的错误...下面的示例现在使用 strdup() 为每个 b[i] 分配内存

**b 指向 n 个指针数组的开头。对于该数组中的每个指针,对于浅拷贝

,您可以这样做 b[0] = a[0]

这是一个浅拷贝,因为 b[0] 将指向与 a[0] 相同的内存。因此改变b[0]的内容会改变a[0]的内容。

深拷贝意味着您有两个完全独立的实体...因此更改内容 b[0] 不会导致更改 a[0] 的内容。这意味着对于每个 b[i],您需要分配新内存并将字符串从 a[i] 复制到新 block 中。

深拷贝:

char *a[n];
// ...intialise array a....
char **b = malloc( sizeof(char *) * n); // allocate array of pointers
if( b )
{
int i = 0;
for(; i < n; ++i)
b[i] = (char *)strdup(a[i]); // allocate memory for new string and copy string
}
else
printf("You ran out of memory!\n");

作为旁白...您已经使用了常量字符串,因此您不应该在技术上修改它们...

char *xxx = "String";
char yyy[] = "String";

你可以放心的修改yyy的内容。通常你可以修改 xxx 的内容没有问题,但是注意,因为字符串内存是在编译时分配的,你可能会发现编译器已经将它放在只读内存中。

编辑:似乎一直在争论是否从 malloc 中强制返回(我一直习惯这样做,但似乎这是一个坏习惯!)...参见 Why do we need to cast what malloc returns?

关于c - 如何将 char *a[] 复制到 char **b?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16187201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com