Ali*_*ani 2 c arrays segmentation-fault
在我的以下程序中,qsort 函数给出了 seg 错误,我无法理解我到底错在哪里:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmpfnc (const void *a, const void *b) {
return *(char *)a - *(char *)b;
}
int checkPermutation_sort (char *s1, char *s2) {
int l1 = strlen(s1);
int l2 = strlen(s2);
if (l1 != l2) return -1;
qsort(s1, l1, sizeof(char), cmpfnc);
qsort(s2, l2, sizeof(char), cmpfnc);
return strcmp(s1, s2);
}
int main () {
printf("%d\n", checkPermutation_sort("abvasfa", "avbasda"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从我尝试调试来看,这不是比较函数的错误。这是排序时内存不足的地方。但我无法理解为什么以及如何,在此处附上函数调用堆栈的屏幕截图:
以下是调试器输出:
Reading symbols from a.out...
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000000121a in checkPermutation_sort
at main.c:17
2 breakpoint keep y 0x000000000000120b in checkPermutation_sort
at main.c:15
3 breakpoint keep y 0x00000000000011b9 in cmpfnc at main.c:7
(gdb) run
Starting program: /home/a.out
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, checkPermutation_sort (s1=0x55555555600c "abvasda", s2=0x555555556004 "avbasfa") at main.c:17
17 qsort(s1, l1, sizeof(char), cmpfnc);
(gdb) next
Breakpoint 3, cmpfnc (a=0x55555555600d, b=0x55555555600e) at main.c:7
7 char c = *(char *)a;
(gdb) next
8 char d = *(char *)b;
(gdb) next
9 return c - d;
(gdb) next
10 }
(gdb) next
msort_with_tmp (p=p@entry=0x7fffffffeb20, b=b@entry=0x55555555600d, n=n@entry=2) at ./stdlib/msort.c:143
143 ./stdlib/msort.c: No such file or directory.
(gdb) next
145 in ./stdlib/msort.c
(gdb) next
139 in ./stdlib/msort.c
(gdb) next
157 in ./stdlib/msort.c
(gdb) next
159 in ./stdlib/msort.c
(gdb) next
0x00007ffff7db0620 in *ABS*+0xa9c90@plt () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) next
Single stepping until exit from function *ABS*+0xa9c90@plt,
which has no line number information.
__memmove_evex_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:307
307 ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S: No such file or directory.
(gdb)
Run Code Online (Sandbox Code Playgroud)
您可能将"abvasda"and"avbasfa"作为字符串文字传递给checkPermutation_sort,并且由于它们被放置在只读段上并且qsort正在修改它们,因此您会遇到段错误。
切换到
char str1[] = "abvasda";
char str2[] = "avbasfa";
checkPermutation_sort(str1, str2);
Run Code Online (Sandbox Code Playgroud)