【发布时间】:2023-03-22 19:41:01
【问题描述】:
我想对声明如下的字符串数组进行排序:
char** s;
s = calloc(4, sizeof(char *));
s[0] = "Banana";
s[1] = "Apple";
s[2] = "Grape";
s[3] = "Strawberry";
为此我使用了 qsort 函数:
size_t len = sizeof(s) / sizeof(char *);
qsort(s, len, sizeof(char *), cmp);
cmp 看起来像这样:
int cmp(const void* s1, const void* s2)
{
const char** a = (const char**) s1;
const char** b = (const char**) s2;
return strcmp(*a, *b);
}
但是,对于此代码,没有任何内容进行排序,并且输出的顺序与数组中的顺序相同。问题是,我用另一种方式检查了它,我将数组声明为(qsort 和 cmp 保持不变):
char* s[] = {"Banana", "Apple", "Grape", "Strawberry"};
并且输出已完美排序。我有点理解是因为,第一种方法是双(指针指针)指针,第二种方法是指向数组的指针,但它们的工作原理是相同的。任何想法如何排序 char** s?先谢谢了
【问题讨论】:
-
你没有为 s 中的每个 char* 分配任何东西。而底部示例是在堆栈上分配的。
-
@JoshAbraham 在这个非常特殊的情况下,这些是字符串文字并且被神奇地分配。
-
@EugeneSh。作为 cmp 的参数代表 void* 指针,这没关系。但是,为了获取字符串,我正在使用这种方法。而且,我看了很多资源,都在做同样的方法
-
@MiradilZeynalli 对。忽略我的第一条评论(无论如何都删除了..)。
-
@JoshAbraham 不在 cmets 中。搜索有关使用字符串文字初始化指针的信息,有很多关于它的问题。
标签: c arrays string sorting pointers