【发布时间】:2022-01-21 15:49:23
【问题描述】:
我一直在尝试在 C 中实现一种快速排序的字符数组,但它给了我一个无法调试的分段错误错误。这是代码:
int partition(char **a, int left, int right)
{
int i, j;
char pivot[16];
strcpy(pivot, a[left]);
i = left;
j = right + 1;
while (1)
{
do
i++;
while (i <= right && strcmp(a[i], pivot) < 0);
do
j--;
while (strcmp(a[j], pivot) > 0);
if (i >= j)
break;
char t[16];
strcpy(t, a[i]);
strcpy(a[i], a[j]);
strcpy(a[j], t);
}
char t[16];
strcpy(t, a[left]);
strcpy(a[left], a[j]);
strcpy(a[j], t);
return j;
}
void quickSortChar(char **a, int left, int right)
{
int j;
if (left < right)
{
j = partition(a, left, right);
quickSortChar(a, left, j - 1);
quickSortChar(a, j + 1, right);
}
}
int main()
{
char **arr = (char **)calloc(10, sizeof(char *));
arr[0] = (char *)malloc(16);
arr[1] = (char *)malloc(16);
arr[2] = (char *)malloc(16);
arr[0] = "patata";
arr[1] = "berenjena";
arr[2] = "alioli";
quickSortChar(arr, 0, 2);
}
更新 1
使用strcpy 也不起作用:
int partition(char **a, int left, int right)
{
int i, j;
char pivot[16];
strcpy(pivot, a[left]);
i = left;
j = right + 1;
while (1)
{
do
i++;
while (strcmp(a[i], pivot) < 0 && i <= right);
do
j--;
while (strcmp(a[j], pivot) > 0);
if (i >= j)
break;
char t[16];
strcpy(t, a[i]);
strcpy(a[i], a[j]);
strcpy(a[j], t);
}
char t[16];
strcpy(t, a[left]);
strcpy(a[left], a[j]);
strcpy(a[j], t);
return j;
}
更新 2
我已经通过上移声明解决了警告。
更新 3
修复while (i <= right && strcmp(a[i], pivot) < 0);
【问题讨论】:
-
最近有人问,使用
strcpy()复制一个字符串。arr[0] = "patata";等会覆盖您分配的指针。 -
您还必须提供声明以满足对函数
partition()的前向引用或移动该函数。不要忽略编译器警告。 -
我尝试过使用 strcpy,但它不起作用。我也解决了警告,但结果相同。
-
您正在分配内存并在分配静态字符串时立即泄漏它;不需要
malloc:char *arr[] = { "patata", "berenjena", "alioli" };,你当然也不需要strcpy。 -
这只是一个例子。在我的真实程序中,我有问题中描述的结构。