考虑char *a[] = {"abc", "xyz", "def"};
深层复制 char *a[]
至char **b
。
有人可以说什么是深拷贝?我们需要为b
分配多少内存?
答案 0 :(得分:1)
char *a[n];
是一个n指针指向char的数组。数组的每个元素在内存中是连续的。所需内存大小为
sizeof(char *) * n
我在这里使用了sizeof()运算符......你可以假设指针有4个字节,但这可能不安全......这取决于你的硬件。
char **b
略有不同。这是一个指向char-point的指针。 ** b没有分配指针数组。首先分配数组......
char **b = malloc( sizeof(char *) * n);
编辑:感谢您同意我指出我的错误......以下示例现在使用strdup()为每个b [i]分配内存
** b指向n个指针数组的开头。对于该数组中的每个指针,你可以这样做,对于浅拷贝
,b [0] = a [0]这是浅拷贝,因为b [0]将指向[0]指向的相同内存。因此,改变内容b [0]将改变[0]的内容。
深拷贝意味着你有两个完全独立的实体......所以改变内容b [0]不会导致改变[0]的内容。这意味着对于每个b [i],您需要分配新内存并将字符串从[i]复制到该新块中。
深度复制:
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?
答案 1 :(得分:1)
在a
数组上行走,eah a[i]
请求空间使用*alloc()
个系列函数之一来分配它,并将结果放在相应的b[i]
中。 b
指针本身应该是一个具有足够空间的指针,用于保存a
中的字符串数作为指针。计算如下:
int bsize = (sizeof(a)/sizeof(a[0])) * sizeof(char*);
char **b = malloc(bsize);
int i,len;
/* if(b == NULL) /* error: no memory */
for(i = 0,len = sizeof(a)/sizeof(a[0]); i < len; i++) {
char *tmp = malloc(strlen(a[i])+1);
if(tmp == NULL) /* error: no memory */
strcpy(tmp, a[i]);
b[i] = tmp;
}
请注意,您需要或保留内存中b
数组的大小,或者将NULL
放在数组的末尾。
答案 2 :(得分:-1)
你可以做到
B = A
这会将指针数组* a [3]的基址分配给b。
现在您可以使用b
访问字符串for example string 1 can be accessed by *(b+0) gives address of string 1
string 2 " " *(b+1) " " string 2
string 3 " " *(b+2) " " string 3
由于您要指向指向指针的指针数组,因此您已经将内存分配给b因此您不需要使用malloc。
只有在运行时将某些数据分配给指针并且尚未在程序中为指针分配内存时才使用malloc。