2013-04-24 53 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