2013-04-24 52 views
1

考虑char *a[] = {"abc", "xyz", "def"};如何将char * a []复制到char ** b?

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

有人可以说什么是深拷贝?我们需要分配多少内存给b

+0

您的第一个问题是回答[这里](http://stackoverflow.com/questions/184710/what-is-the-difference-between-a-deep-copy-and-a-shallow-copy) – Krishnabhadra 2013-04-24 08:37:11

+5

this你的作业对吗?深拷贝意味着你应该复制值,而不仅仅是指针,b需要12个字节 – x4rf41 2013-04-24 08:37:40

+0

@ x4rf41,在'char'是一个字节的平台上:)并且这不需要考虑指针:) – StoryTeller 2013-04-24 08:39:24

回答

1
char *a[n]; 

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

sizeof(char *) * n 

我在这里使用了的sizeof()操作...你可以承担的指针4个字节,但是这可能不是安全的?这取决于你的硬件。

char **b 

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

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

编辑:谢谢interjay指出我的错误...下面的例子现在使用的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"); 

作为asside ... 您已经使用的字符串常量,所以你不应该在技术上对其进行修改......

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

您可以安全地修改yyy的内容。通常情况下,您可以毫无问题地修改xxx的内容,但请注意,由于字符串内存是在编译时分配的,因此您可以发现编译器已将其放在只读内存中。

编辑: 似乎对是否投从malloc的回报是人们争论(!这是我一直在做的习惯,但似乎这是一种不好的习惯)......看到Why do we need to cast what malloc returns?

+0

您需要为每个'b [i]'分配内存。 – interjay 2013-04-24 09:01:48

+0

@interjay:是的你的权利,谢谢你发现! – Jimbo 2013-04-24 09:04:58

+0

malloc()返回void *,你需要投它 – 2013-04-24 09:51:02

-1

可以只是

b =指针阵列的

这将分配基地址* [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。

+1

这不会是[深层复制](http://en.wikipedia.org/wiki/Object_copy#Deep_copy)。 – interjay 2013-04-24 09:18:37

1

行走在a数组上,请求空间通过使用*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在阵列结束。

+0

dowvotes?注释? – Jack 2013-04-24 21:26:25

+0

downvote可能是由于使用sizeof(int)而不是sizeof(char *)来计算'bsize'或未定义的变量'tmp'。 – Armali 2016-08-30 09:31:20

+0

@Armali固定.. – Jack 2016-08-30 15:55:51