gpt4 book ai didi

c - strcmp 导致段错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:24:10 24 4
gpt4 key购买 nike

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int my_compare(const void * a, const void * b);

int main()
{
char s[][80] =
{ "gxydyv", "gdyvjv", "lfdtvr", "ayfdbk", "sqkpge", "axkoev", "wdjitd", "pyrefu", "mdafyu",
"zdgjjf", "awhlff", "dqupga", "qoprcn", "axjyfb", "hfrgjf", "dvhhhr" };
int i;
puts("#Before:#");
for (i = 0; i < 16; i++)
puts(s[i]);
qsort(s, 16, sizeof *s, my_compare);
putchar('\n');
puts("#After:#");
for (i = 0; i < 16; i++)
puts(s[i]);
return 0;
}

int my_compare(const void *a, const void *b)
{
return strcmp(*(char **)a, *(char **)b);
}

这是输出:

#Before:#
gxydyv
gdyvjv
lfdtvr
ayfdbk
sqkpge
axkoev
wdjitd
pyrefu
mdafyu
zdgjjf
awhlff
dqupga
qoprcn
axjyfb
hfrgjf
dvhhhr
Segmentation fault

我还注意到strcmp的原型(prototype)是:int strcmp(const char *s1,const char *s2);

我假设 my_compare 中 a 和 b 的类型是“指向字符数组的指针”。结果,*(char **)a 是一个“指向 char 的指针”,这正是 strcmp 所期望的。

那么问题出在哪里呢?

最佳答案

改变:

return strcmp(*(char **) a, *(char **) b);

收件人:

return strcmp(a,b);

你有一个额外的指针取消引用级别是不正确的,这就是你得到段错误的原因。也就是说,您传递的是 char 不是 char 指针 [被 Actor 掩盖了]。

注意:这里不需要从 void * 进行转换。


更新:

在回答您的问题时,是的,因为您定义 sqsort 调用的方式。

如果你这样做了,你原来的 my_compare 就没问题了:

char *s[] = { ... };

并将您的 qsort 调用更改为:

qsort(s, 16, sizeof(char *), my_compare);

总而言之,这里有两种方法可以做到这一点

int
main()
{
char s[][80] = { ... }

qsort(s, 16, 80, my_compare);

return 0;
}

int
my_compare(const void *a, const void *b)
{
return strcmp(a,b);
}

这有点干净[在数组中使用更少的空间]:

int
main()
{
char *s[] = { ... }

qsort(s, 16, sizeof(char *), my_compare);

return 0;
}

int
my_compare(const void *a, const void *b)
{
return strcmp(*(char **) a,*(char **) b);
}

更新#2:

回答你的第二个问题:

这些甚至都无法编译:

return strcmp((char ()[80])a,(char ()[80])b);
return strcmp(*(char ()[80])a,*(char ()[80])b);
return strcmp((char [][80])a,(char [][80])b);
return strcmp(*(char [][80])a,*(char [][80])b);

但是,即使这样做了,它们在逻辑上也是不正确的。以下代码编译,但在逻辑上更接近qsort传递的内容:

return strcmp((char [80])a,(char [80])b);

但是,当函数传递定义为 char x[80] 的内容时,它与 char *x 相同,所以 qsort 正在传递 char * [伪装成 void *]。

旁注:使用 char *s[] 要好得多。它允许任意长度的字符串。如果给定的字符串超过 [或正好] 80 个字符,则另一种形式 char s[][80] 实际上会失败。


我认为您理解这一点很重要:

  1. 数组通过引用调用
  2. 数组和指针的互换性

下面两个是等价的:

char *
strary(char p[])
{

for (; *p != 0; ++p);

return p;
}

char *
strptr(char *p)
{

for (; *p != 0; ++p);

return p;
}

考虑以下[外部]定义:

char x[] = { ... };
char *x = ...;

Either 这两个可以传递给 strary 和/或 strptr any 以下形式[共20个]:

strXXX(x);
strXXX(x + 0);
strXXX(&x[0]);

strXXX(x + 1);
strXXX(&x[1]);

此外,请在此处查看我最近的回答:Issue implementing dynamic array of structures

关于c - strcmp 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34562138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com