在C中,如何更改指针指向的内存地址?

时间:2013-05-28 21:43:57

标签: c pointers memory memory-management

所以例如我有一个有3个指针的char **数组。 让我们说:

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?

还有数组[1],它指向0x7ffffffc而不是0x80033d?

我已经尝试了不同类型的演员,但却无法让它发挥作用。

编辑:

感谢大家看我的问题。我问这个的原因是因为我正在使用内核,我需要将参数从内核空间复制到用户空间。我想我可以通过将arg字符串复制到用户空间然后更改原始args指针指向内核空间的内存地址来实现。我想这不是一个好主意。

3 个答案:

答案 0 :(得分:1)

  

我有一个有3个指针的char **数组

不,你没有。你有一个包含三个值的数组。值恰好是指针。数组没有指针。

假设您为此数组(指向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" );

现在你要复制一份。实际上是副本,因为您不仅为新数组(指向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]现在拥有一个指向释放内存的指针,该指针无法使用。使用它会导致错误。

最好不要让多个变量(在同一范围内)保持与分配的内存相同的指针。这可能使得很难推断指针的有效性。

答案 1 :(得分:0)

char ** array是指针的指针。 在这种情况下,它会被赋予一个char指针数组,每个指针都包含最终cstrings的第一个char的地址。

因此,您可以使用等号,就像使用其他常规指针一样:

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

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

答案 2 :(得分:-3)

基本上,数组是指向起始地址的指针。因此,array [n]等于*(array + n)。如果你想移动你的整个数组,你可以做类似的事情

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