【问题标题】:Assigning pointers to pointers将指针分配给指针
【发布时间】:2013-12-10 07:09:22
【问题描述】:

我有指向 char 的指针的指针设置为:

    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

提前感谢您的帮助。

Edit2:在一些帮助下,对其进行了更改,它适用于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--)

一切正常!

【问题讨论】:

  • 问题出在您的代码中。尝试将其剥离并在此处复制剥离的版本。
  • 你指向指针的指针有一半时间是未初始化的,你在这里发布的代码将 constants 的地址分配给指针,它们是只读的,不能乱和。补充:sizeof(ptr_var) 可能是 4(或 8,如果 64 位)
  • A = {"aa", "ba", "bc", "bd"}; 语法无效

标签: c arrays sorting pointers radix


【解决方案1】:

当你分配时

 A = B;

你指定A指向同一个内存B指向,而不是A指向B

为了复制数组,您需要分配内存来保存它并 memcpy 从 BA 的所有内容

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

那么,如果你对AB 进行排序,它不会影响另一个,因为你有副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2011-03-19
    • 2017-02-02
    相关资源
    最近更新 更多