【发布时间】:2016-05-31 05:30:54
【问题描述】:
我在理解为什么一段代码有效时遇到了一些麻烦。下面是stdlib实现qsort的比较函数:
int scmp(const void *p1, const void * p2)
{
char *v1, *v2;
v1 = (char *) p1;
v2 = (char *) p2;
return strcmp(v1,v2);
}
当然,这只适用于字符串。我的问题是:为什么下面的代码有效?
int scmp(const void *p1, const void * p2)
{
char *v1, *v2;
v1 = *(char **) p1;
v2 = *(char **) p2;
return strcmp(v1,v2);
}
在我看来,在第二个版本中,我将明显是 char* 的内容强制转换为 char**。问题是该变量仍将包含char 变量的地址。当我申请* 时,我的理解是C 将通过获取p1 的内容来处理这个命令,然后在存储在里面的地址之后读取8 个字节(在我的拱上),这样它最终会得到一个值char* 类型。
在我看来,这应该会导致将 8 个字符组合成无效的内存地址。
不过,这两个功能都同样有效。我哪里错了?
【问题讨论】:
-
第二个版本对我来说似乎是正确的。如果不查看其余代码,很难说出第一个版本的工作原理。
-
函数怎么调用?如果你像
scmp("hello", "hello");这样调用函数,只有第一个版本可以工作:ideone.com/P96Wmj -
它在某些情况下似乎有效,但并非对所有情况都有效。例如,如果 p1 指向字符串“abcdefgh”,p2 指向另一个字符串“abcdefgh”。现在字符串是相等的,所以它们都被解释为相同的地址(我们称之为 p)。然后strcmp会将p处的字符串与p处的字符串进行比较,由于两个参数都指向同一个地址,所以内容按照定义是一样的。
-
@RSahu:你能解释一下为什么它看起来是正确的吗?
-
这两个函数都是正确的,具体取决于
p1和p2是什么,但第二个函数是qsort()在 char*(字符串)数组上用作比较函数的函数.