我有指向 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--)
一切正常!
最佳答案
当你分配
A = B;
您分配 A
指向 B
指向的相同内存,而不是 A
指向 B
.
为了复制数组,您需要分配内存来保存它,并将 B
中的所有内容 memcpy 到 A
char ** A = malloc(sizeof(*A) * numitems);
memcpy(A, B, sizeof(*A) * numitems);
然后,如果您对 A
或 B
进行排序,则不会影响另一个,因为您有副本。
关于c - 将指针分配给指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20195089/