指针指向指针的赋值

4

我有一个指向字符指针的指针,设置如下:

    char **A;
    char **B;

我正在使用基数排序来对字符串进行排序,需要多次排序。但是,如果我只对数组 A 进行排序并将结果保存到数组 B 中,这并不是我想要的。我希望将已几乎排好序的数组 B 赋值给数组 A,然后再进行排序,但是当我这样做时:

    A = B;

我只是设置了指针,对吧?这意味着A现在指向B。当我稍后重新分配值时,我会得到多个相同字符串的结果。例如:

    A = {"aa", "ba", "bc", "bd"};

排序并使用A = B后,输出结果如下:
    B = {"aa", "aa", "bc", "bd"};

我还尝试使用memcpy() - 这应该将B指向的内容复制到A指向的位置,对吗?但结果是一样的。不知道如何使其正常工作。我不确定是否应在此处发布完整代码,因此我将其上传到pastebin上。
提前感谢任何帮助。
编辑2:在一些帮助下,进行了更改,并通过memcpy()成功运行,但它仍然不能“稳定”排序,而且B = {"bb", "bc"}相反: B = {"bc", "bb"}。我仍在努力,但没有结果... 但。
void CSort(int p){

int k = 123;
int C[k];
int i;

for(i = 0; i <= k; i++){
    C[i] = 0;
}

for(i = 0; i < ILE; i++){
    C[(int)As[i][p]]++;
}

for(i = 1; i <= k; i++){
    C[i] = C[i] + C[i - 1];
}

for(i = 0; i < ILE; i++){     // ile means how many words there are
    Bs[C[(int)As[i][p]] - 1] = As[i];
    printf("As[%i][%i] == %c ", i, p, As[i][p]);
    printf("C[%i] == %i ", (int)As[i][p], C[(int)As[i][p]]-1);
    printf("  Bs[%i]  == %s \n", C[(int)As[i][p]] - 1, Bs[C[(int)As[i][p]] - 1]);

    //(As[i], Bs[C[(int)As[i][p]]], sizeof(As[i]));
    C[(int)As[i][p]]--;
}


}

这是我的计数排序,接下来是基数排序:
void RSort(int d){
    int i;
    for(i = d; i >= 0; i--){
        CSort(i);
        memcpy(As, Bs, sizeof(*As) * ILE);
    }
}

我甚至不知道为什么会出问题 - 因为在纸面上看起来它运行良好!

要解决我的问题,我所要做的就是改变最后一个循环中的顺序:

for(i = 0; i < ILE; i++)

改为

for(i = ILE - 1; i >= 0; i--)

一切都正常工作!


1
问题出在你的代码上。尝试简化它并将简化版本复制到这里。 - perror
你的指向指针的指针有一半时间未初始化,而你在此处发布的代码将常量的地址分配给指针,它们是只读的,不能被更改。另外:sizeof(ptr_var) 可能是4(如果是64位,则为8)。 - Elias Van Ootegem
A = {"aa", "ba", "bc", "bd"}; 不是有效的语法。 - newacct
1个回答

2

When you assign

 A = B;

你将A分配给指向与B指向相同的内存,而不是让A指向B

为了复制数组,您需要分配内存来容纳它,并且使用memcpy从BA复制所有内容。

char ** A = malloc(sizeof(*A) * numitems);
memcpy(A, B, sizeof(*A) * numitems);

如果你对AB进行排序,不会影响另一个,因为你有复制品。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接