2013-05-28 140 views
-2

因此,例如我有一個char **數組有3個指針。 比方說:在C中,如何更改指針指向的內存地址?

array[0] has abc (points to "a", which lives in address 0x80033de0) 
array[1] has def (points to "d", which lives in address 0x80033d) 
array[2] has NULL 

假設我抄陣列的串到不同的不同的存儲位置,讓我們說

0x7ffffff8 has abc (points to "a") 
0x7ffffffc has def (points to "d") 

我怎樣才能改變陣列[0],使其指向0x7ffffff8而不是0x80033de0?

還array [1],以便它指向0x7ffffffc而不是0x80033d?

我已經嘗試過不同種類的鑄造,但一直未能得到它的工作。

編輯:

感謝您看我的問題的每個人。我問這個的原因是因爲我正在使用內核,我需要將參數從內核空間複製到用戶空間。我認爲我可以通過將arg字符串複製到用戶空間,然後更改原始args指針指向內核空間的內存地址。我想這不是一個好主意。

+2

你試過了什麼?你應該可以做'array [0] =(char *)0x7FFFFFF8' – slugonamission

+3

「我已經嘗試過不同類型的轉換,但一直無法使它工作。」 - 然後向我們展示代碼和錯誤。 – millimoose

+0

你究竟在做什麼?你想有一個'char **'的深層副本嗎?你想擁有複製感知結構嗎?請多說明一點。 –

回答

1

我有一個char **陣列,擁有3個三分球

不,你不知道。你有一個有三個值的數組。這些值恰好是指針。一個數組不指針。

假設你爲這個數組分配存儲器(指針到char):

char **array = malloc(3 * sizeof(char*)); // 3 values in the array 

,然後爲每個串分配內存:

array[0] = malloc(4 * sizeof(char)); // 3 + 1 null terminator 
array[1] = malloc(4 * sizeof(char)); 
array[2] = 0; 

最後你的字符串本身中設置的值:

strcpy(array[0], "abc"); 
strcpy(array[1], "def"); 

現在你想複製一份。 A 複製實際上,因爲你不僅分配內存爲一個新的數組(指向char的指針),但你也爲新的字符串分配內存。 你做同樣的配置:

char **array2 = malloc(3 * sizeof(char*)); 
array2[0] = malloc(4 * sizeof(char)); 
array2[1] = malloc(4 * sizeof(char)); 
array2[2] = 0; 

現在你複製實際的字符串:

strcpy(array2[0], array[0]); 
strcpy(array2[1], array[1]); 

如果你的代碼從一個不同的上面,更多的細節編輯你的問題。

棘手的部分是讓array [0]保存array2 [0]中的地址(array [1]和array2 [1]相同)。問題來自於您通過malloc分配的內存需要通過free釋放。

所以你不能只是做

array[0] = array2[0]; 

因爲你已經失去了你分配的第一個字符串的所有引用。那個內存是泄露了

而是做到這一點:

free(array[0]); 
array[0] = array2[0]; 

這將釋放用於第一串和拷貝複製的地址的內存。

現在,您在兩個變量中具有相同的指針(值)。這也是棘手,因爲(當你不再需要它),你仍然需要釋放分配給該副本的記憶:

free(array2[0])

棘手部分是array[0]現在有一個指針指向釋放內存,無法使用。使用它會導致錯誤。

這可能是一個好主意,不要讓多個變量(在相同的範圍內)保持指向分配內存的指針。這可能導致難以推斷指針的有效性。

0

char ** array是指針的指針。 在這種情況下,它被賦予一個char指針數組,每個char指針都包含最終cstrings的第一個字符的地址。

因此,可以只使用等號,就像使用的其它常規的指針:

array[0] = (char*)0x7ffffffc;

array[1] = (char*)0x80033d;

+2

沒有'char **'永遠不會變成數組。它可能指向數組的第一個元素。閱讀[comp.lang.c常見問題](http://www.c-faq.com/)的第6部分。 –

+0

是的,編輯一秒鐘前。不管怎麼說,多謝拉。 – Julius

+0

更好,但'char **'不會與'char'的地址「等效」。 –

-3

基本上陣列是一個指向起始地址。因此array [n]等於*(array + n)。如果你想將你的整個數組,你可以做類似

array = newPointer; //newPointer is something like char *newPointer; 
//notice the array without brackets because you want the pointer! 
+0

C中的數組不可分配。 –

+2

數組不是指針。請參閱[comp.lang.c常見問題](http://www.c-faq.com/)的第6部分。 –