所以例如我有一个有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指针指向内核空间的内存地址来实现。我想这不是一个好主意。
答案 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!