c – 指定指针的指针

我有指向char set指针的指针:

    char **A;
    char **B;

我正在使用Radix-Sort进行字符串排序,我必须对它进行排序几次,但是如果我对它进行排序,它只是对数组A进行排序并将结果保存在数组B中.我想要做的是将A分配给是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]]--;
}


}

这是我的Counting Sort,这是我的基数:

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--)

一切正常!

最佳答案 当你分配

 A = B;

你指定A指向相同的存储器B指向,而不指向A指向B.

为了复制数组,您需要分配内存来保存它并将所有内容从B记忆到A

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

然后,如果您对A或B进行排序,它将不会影响另一个,因为您有副本.

点赞