2013-05-28 96 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部分。 –