因此,例如,我有一个具有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")


如何更改array [0],使其指向0x7ffffff8而不是0x80033de0?

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

我已经尝试过各种类型的转换,但无法使其正常工作。

编辑:

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

最佳答案

我有一个具有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]现在拥有一个指向释放的内存的指针,该指针无法使用。使用它会导致错误。

最好不要有多个变量(在同一范围内)持有指向已分配内存的相同指针。这可能使推理指针的有效性变得困难。

10-02 04:20