对导致段错误的字符数组进行 qsort

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)

Dav*_*eri 7

您可能将"abvasda"and"avbasfa"作为字符串文字传递给checkPermutation_sort,并且由于它们被放置在只读段上并且qsort正在修改它们,因此您会遇到段错误。

切换到

char str1[] = "abvasda";
char str2[] = "avbasfa";

checkPermutation_sort(str1, str2);
Run Code Online (Sandbox Code Playgroud)

  • @AliasgarMusani 主要区别在于字符串文字放置在 .rodata 部分(ro 代表只读),请查看 https://en.wikipedia.org/wiki/Data_segment (2认同)