【发布时间】:2016-03-20 18:25:03
【问题描述】:
我有一个动态分配的字符串数组,我已经做到了,最后一项总是NULL。现在,我想实现各种排序功能,从字母开始(但我不关心这里的比较功能本身)。
我已经写了这个基本的排序函数:
void string_sort(char **array)
{
char *tmp = malloc(sizeof(char*));
int i = 0;
while (array[i + 1] != NULL) {
int j = 0;
while (array[j + 1] != NULL) {
if (strcmp(array[j], array[j + 1]) > 0) {
strcpy(tmp, array[j]); /* line 91 */
strcpy(array[j], array[j + 1]); /* line 92 */
strcpy(array[j + 1], tmp);
}
j++;
}
i++;
}
free(tmp);
}
现在,这个功能似乎起作用了,排序是正确的。但是 valgrind 说了很多遍:
Invalid write of size 1(第 92 行)
Invalid read of size 1(在第 91 和 92 行)
我做错了什么导致记忆受到破坏?
【问题讨论】:
-
你有一个指针数组。你可以交换它们;无需复制字符串。由于它们的长度可变,因此无论如何这是一个非常糟糕的主意。如果你 yopc 一个字符串变短怎么办?
-
你也分配了错误的类型。指针不是数组!
-
您不需要为您想要完成的每种类型的排序编写完整的排序例程,使用
qsort,您只需要编写一个比较函数让qsort为您处理排序. (它会比你编写的任何排序程序快 10 倍) -
如果您要分配一个指针数组来键入,您可以单独分配每个字符串所需的内存量。 (它被称为 jagged 或 ragged 数组)。
qsort与锯齿状阵列同样有效。 -
@DavidC.Rankin 是的,将它用于任何真实的事情都是不明智的,我对排序算法了解一两件事。这只是为了学习,我正在尝试更多地了解更接近硬件的东西。感谢
qsort提示!
标签: c arrays sorting memory-management