2

我编写了一个程序,它采用按字典顺序排列的字符串并执行这些字符串的下一个按字典顺序排列,例如:

strings: a b c d
a b c d
a b d c
a c b d
a c d b
a d b c
a d c b
...
d c b a

如果重复一个字符串,你必须确保步骤不是,例如:

strings: a bc bc
NOT GOOD   GOOD
a bc bc    a bc bc
a bc bc    bc a bc
bc a bc    bc bc a
bc bc a
bc bc a
bc a bc

这个程序适用于最多 5 个字符串的 n 个,但它必须最多工作 9 个。然而,在 6 上,程序中止,我不知道如何修复它。我知道问题出在哪里,至少我认为我知道,但这已经足够长了,这是我使用 pwngdb 和 valgrind 正常运行程序时遇到的代码和错误。

****SPOILERS**** 这个问题来自 HackerRank,如果您还没有弄清楚,请不要看这个、答案和评论。

代码:

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

void 
swap(char **s, int a, int b) 
{
    char *t;
    t = malloc(11 * sizeof(char));

    t = s[a];
    s[a] = s[b];
    s[b] = t;
}

void 
sort(char **s, int d, int n) 
{
    int i, k;

    for(k = 0; k <= n; k++)
        for(i = d + 1; i < n; i++)
            if(strcmp(s[i-1], s[i]) > 0)
                swap(s, i-1, i);
}

void 
to_string(char **s, char *t, int n) 
{
    int i;
    for(i = 0; i < n; i++)
        if(i == 0)
            strcpy(t, s[i]);
        else
            strcat(t, s[i]);
}

int next_permutation(int n, char **s)
{
    /**
    * Complete this method
    * Return 0 when there is no next permutation and 1 otherwise
    * Modify array s to its next permutation
    */
    int i;

    static unsigned int *p, p_step, *m, lock;

    if(!lock) {
        p       = calloc(n + 1, sizeof(int));
        p_step  = 1;
        m       = malloc(n + 1 * sizeof(int));
        m[0]    = 0;
        for(i = 1; i <= n; i++)
            m[i] = n;

        p[0]    = 1;
        for(i = 1; i <= n; i++)
            p[i] = p[i - 1] * i;

        lock    = 1;
    }

    if(p_step >= p[n])
        return 0;

    char *pre, *post;
    pre     = malloc(11 * n * sizeof(char)); // I think these two are the trouble makers, maybe not
    post    = malloc(11 * n * sizeof(char));

    to_string(s, pre, n);

    int d = 1;
    for(i = 1; i <= n; i++)
        if(!(p_step % p[i]))
            d = i;

    if((n - d - 1) >= --m[d])
        m[d] = n - 1;

    swap(s, n - d - 1 , m[d]);

    to_string(s, post, n);

    p_step++;
    if(!strcmp(pre, post)) 
    {
        if(p_step >= p[n] - 1)
            return 0;
        next_permutation(n, s);
    }

    sort(s, n - d, n);

    return 1;
}

int main()
{
    char **s;
    int n;
    scanf("%d", &n);
    s = calloc(n, sizeof(char*));
    for (int i = 0; i < n; i++)
    {
        s[i] = calloc(11, sizeof(char));
        scanf("%s", s[i]);
    }
    do
    {
        for (int i = 0; i < n; i++)
            printf("%s%c", s[i], i == n - 1 ? '\n' : ' ');
    } while (next_permutation(n, s));
    for (int i = 0; i < n; i++)
        free(s[i]);
    free(s);
    return 0;
}
$ ./a.out
6
a
b
c
d
e
f
a b c d e f
a.out: malloc.c:2379: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)
pwndbg> run
Starting program: /home/TESTS/a.out 
6
a
b
c
d
e
f
a b c d e f
a.out: malloc.c:2379: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
───────────────────────────────────────────────────────────────────────────────────────────────────[ REGISTERS ]───────────────────────────────────────────────────────────────────────────────────────────────────
 RAX  0x0
 RBX  0x7ffff7f96540 ◂— 0x7ffff7f96540
 RCX  0x7ffff7dea3eb (raise+203) ◂— mov    rax, qword ptr [rsp + 0x108]
 RDX  0x0
 RDI  0x2
 RSI  0x7fffffffd960 ◂— 0x0
 R8   0x0
 R9   0x7fffffffd960 ◂— 0x0
 R10  0x8
 R11  0x246
 R12  0x0
 R13  0x1000
 R14  0x555555559c00 ◂— 0x600000006
 R15  0x3
 RBP  0x50
 RSP  0x7fffffffd960 ◂— 0x0
 RIP  0x7ffff7dea3eb (raise+203) ◂— mov    rax, qword ptr [rsp + 0x108]
────────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────────────────────────────────────────
 ► 0x7ffff7dea3eb <raise+203>    mov    rax, qword ptr [rsp + 0x108]
   0x7ffff7dea3f3 <raise+211>    xor    rax, qword ptr fs:[0x28]
   0x7ffff7dea3fc <raise+220>    jne    raise+260 <0x7ffff7dea424>
    ↓
   0x7ffff7dea424 <raise+260>    call   __stack_chk_fail <0x7ffff7ed6dd0>

   0x7ffff7dea429                nop    dword ptr [rax]
   0x7ffff7dea430 <killpg>       endbr64 
   0x7ffff7dea434 <killpg+4>     test   edi, edi
   0x7ffff7dea436 <killpg+6>     js     killpg+16 <0x7ffff7dea440>

   0x7ffff7dea438 <killpg+8>     neg    edi
   0x7ffff7dea43a <killpg+10>    jmp    kill <0x7ffff7dea6e0>

   0x7ffff7dea43f <killpg+15>    nop    
─────────────────────────────────────────────────────────────────────────────────────────────────────[ STACK ]─────────────────────────────────────────────────────────────────────────────────────────────────────
00:0000│ rsi r9 rsp  0x7fffffffd960 ◂— 0x0
01:0008│             0x7fffffffd968 —▸ 0x7ffff7f959d8 —▸ 0x7ffff7fd0a06 ◂— 'GLIBC_PRIVATE'
02:0010│             0x7fffffffd970 —▸ 0x7ffff7ffd9e8 (_rtld_global+2440) —▸ 0x7ffff7fd0000 ◂— 0x10102464c457f
03:0018│             0x7fffffffd978 —▸ 0x7ffff7ffe4f0 —▸ 0x7ffff7ffe450 —▸ 0x7ffff7f95520 —▸ 0x7ffff7ffe190 ◂— ...
04:0020│             0x7fffffffd980 ◂— 0x0
05:0028│             0x7fffffffd988 —▸ 0x7ffff7dc8aa8 ◂— 0x1ea020
06:0030│             0x7fffffffd990 ◂— 0x7fff00000001
07:0038│             0x7fffffffd998 —▸ 0x7ffff7dc8ac0 ◂— 0x1ea018
───────────────────────────────────────────────────────────────────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────────────────────────────────────────────────────────────────
 ► f 0     7ffff7dea3eb raise+203
   f 1     7ffff7dc9899 abort+299
   f 2     7ffff7e3c4ba
   f 3     7ffff7e3eb0f sysmalloc+1855
   f 4     7ffff7e3f963 _int_malloc+3363
   f 5     7ffff7e41304 malloc+116
   f 6     555555555531 next_permutation+318
   f 7     5555555557dd main+283
   f 8     7ffff7dcb1e3 __libc_start_main+243
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Program received signal SIGABRT
pwndbg> backtrace
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007ffff7dc9899 in __GI_abort () at abort.c:79
#2  0x00007ffff7e3c4ba in __malloc_assert (assertion=assertion@entry=0x7ffff7f5f2d8 "(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)", file=file@entry=0x7ffff7f5b43f "malloc.c", line=line@entry=2379, function=function@entry=0x7ffff7f5fa60 <__PRETTY_FUNCTION__.13032> "sysmalloc") at malloc.c:298
#3  0x00007ffff7e3eb0f in sysmalloc (nb=nb@entry=80, av=av@entry=0x7ffff7f8eb80 <main_arena>) at malloc.c:2379
#4  0x00007ffff7e3f963 in _int_malloc (av=av@entry=0x7ffff7f8eb80 <main_arena>, bytes=bytes@entry=66) at malloc.c:4141
#5  0x00007ffff7e41304 in __GI___libc_malloc (bytes=66) at malloc.c:3058
#6  0x0000555555555531 in next_permutation (n=6, s=0x5555555596b0) at test.c:62
#7  0x00005555555557dd in main () at test.c:106
#8  0x00007ffff7dcb1e3 in __libc_start_main (main=0x5555555556c2 <main>, argc=1, argv=0x7fffffffde78, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffde68) at ../csu/libc-start.c:308
#9  0x000055555555518e in _start ()
pwndbg> 
$ valgrind --leak-check=full --show-leak-kinds=all ./a.out
==23746== Memcheck, a memory error detector
==23746== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==23746== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==23746== Command: ./a.out
==23746== 
6
a
b
c
d
e
f
a b c d e f
==23746== Invalid write of size 4
==23746==    at 0x10947F: next_permutation (test.c:49)
==23746==    by 0x1097DC: main (test.c:106)
==23746==  Address 0x4a72b78 is 8 bytes inside a block of size 10 alloc'd
==23746==    at 0x483A7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==23746==    by 0x10944A: next_permutation (test.c:46)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
a b c d f e
==23746== Invalid write of size 4
==23746==    at 0x1095D6: next_permutation (test.c:72)
==23746==    by 0x1097DC: main (test.c:106)
==23746==  Address 0x4a72b78 is 8 bytes inside a block of size 10 alloc'd
==23746==    at 0x483A7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==23746==    by 0x10944A: next_permutation (test.c:46)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
==23746== Conditional jump or move depends on uninitialised value(s)
==23746==    at 0x1095DC: next_permutation (test.c:72)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
==23746== Use of uninitialised value of size 8
==23746==    at 0x1092B1: swap (test.c:10)
==23746==    by 0x10962A: next_permutation (test.c:75)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
==23746== Use of uninitialised value of size 8
==23746==    at 0x1092CF: swap (test.c:11)
==23746==    by 0x10962A: next_permutation (test.c:75)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
a b c e d f
a b c e f d
a b c f d e
a b c f e d
==23746== Invalid read of size 4
==23746==    at 0x1095D1: next_permutation (test.c:72)
==23746==    by 0x1097DC: main (test.c:106)
==23746==  Address 0x4a72b7c is 2 bytes after a block of size 10 alloc'd
==23746==    at 0x483A7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==23746==    by 0x10944A: next_permutation (test.c:46)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
==23746== Invalid read of size 4
==23746==    at 0x1095D8: next_permutation (test.c:72)
==23746==    by 0x1097DC: main (test.c:106)
==23746==  Address 0x4a72b7c is 2 bytes after a block of size 10 alloc'd
==23746==    at 0x483A7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==23746==    by 0x10944A: next_permutation (test.c:46)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
==23746== Invalid read of size 4
==23746==    at 0x109610: next_permutation (test.c:75)
==23746==    by 0x1097DC: main (test.c:106)
==23746==  Address 0x4a72b7c is 2 bytes after a block of size 10 alloc'd
==23746==    at 0x483A7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==23746==    by 0x10944A: next_permutation (test.c:46)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
a b d c e f
a b d c f e
==23746== Invalid write of size 4
==23746==    at 0x1095FA: next_permutation (test.c:73)
==23746==    by 0x1097DC: main (test.c:106)
==23746==  Address 0x4a72b78 is 8 bytes inside a block of size 10 alloc'd
==23746==    at 0x483A7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==23746==    by 0x10944A: next_permutation (test.c:46)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
a b d e c f
a b d e f c
a b d f c e
a b d f e c
a b e c d f
a b e c f d
a b e d c f
a b e d f c
a b e f c d
a b e f d c
a b f c d e
a b f c e d
a b f d c e
a b f d e c
a b f e c d
a b f e d c
a c b d e f
a c b d f e
a c b e d f
a c b e f d
a c b f d e
a c b f e d
a c d b e f
a c d b f e
a c d e b f
a c d e f b
a c d f b e
a c d f e b
a c e b d f
a c e b f d
a c e d b f
a c e d f b
a c e f b d
a c e f d b
a c f b d e
a c f b e d
a c f d b e
a c f d e b
a c f e b d
a c f e d b
a d b c e f
a d b c f e
a d b e c f
a d b e f c
a d b f c e
a d b f e c
a d c b e f
a d c b f e
a d c e b f
a d c e f b
a d c f b e
a d c f e b
a d e b c f
a d e b f c
a d e c b f
a d e c f b
a d e f b c
a d e f c b
a d f b c e
a d f b e c
a d f c b e
a d f c e b
a d f e b c
a d f e c b
a e b c d f
a e b c f d
a e b d c f
a e b d f c
a e b f c d
a e b f d c
a e c b d f
a e c b f d
a e c d b f
a e c d f b
a e c f b d
a e c f d b
a e d b c f
a e d b f c
a e d c b f
a e d c f b
a e d f b c
a e d f c b
a e f b c d
a e f b d c
a e f c b d
a e f c d b
a e f d b c
a e f d c b
a f b c d e
a f b c e d
a f b d c e
a f b d e c
a f b e c d
a f b e d c
a f c b d e
a f c b e d
a f c d b e
a f c d e b
a f c e b d
a f c e d b
a f d b c e
a f d b e c
a f d c b e
a f d c e b
a f d e b c
a f d e c b
a f e b c d
a f e b d c
a f e c b d
a f e c d b
a f e d b c
a f e d c b
b a c d e f
b a c d f e
b a c e d f
b a c e f d
b a c f d e
b a c f e d
b a d c e f
b a d c f e
b a d e c f
b a d e f c
b a d f c e
b a d f e c
b a e c d f
b a e c f d
b a e d c f
b a e d f c
b a e f c d
b a e f d c
b a f c d e
b a f c e d
b a f d c e
b a f d e c
b a f e c d
b a f e d c
b c a d e f
b c a d f e
b c a e d f
b c a e f d
b c a f d e
b c a f e d
b c d a e f
b c d a f e
b c d e a f
b c d e f a
b c d f a e
b c d f e a
b c e a d f
b c e a f d
b c e d a f
b c e d f a
b c e f a d
b c e f d a
b c f a d e
b c f a e d
b c f d a e
b c f d e a
b c f e a d
b c f e d a
b d a c e f
b d a c f e
b d a e c f
b d a e f c
b d a f c e
b d a f e c
b d c a e f
b d c a f e
b d c e a f
b d c e f a
b d c f a e
b d c f e a
b d e a c f
b d e a f c
b d e c a f
b d e c f a
b d e f a c
b d e f c a
b d f a c e
b d f a e c
b d f c a e
b d f c e a
b d f e a c
b d f e c a
b e a c d f
b e a c f d
b e a d c f
b e a d f c
b e a f c d
b e a f d c
b e c a d f
b e c a f d
b e c d a f
b e c d f a
b e c f a d
b e c f d a
b e d a c f
b e d a f c
b e d c a f
b e d c f a
b e d f a c
b e d f c a
b e f a c d
b e f a d c
b e f c a d
b e f c d a
b e f d a c
b e f d c a
b f a c d e
b f a c e d
b f a d c e
b f a d e c
b f a e c d
b f a e d c
b f c a d e
b f c a e d
b f c d a e
b f c d e a
b f c e a d
b f c e d a
b f d a c e
b f d a e c
b f d c a e
b f d c e a
b f d e a c
b f d e c a
b f e a c d
b f e a d c
b f e c a d
b f e c d a
b f e d a c
b f e d c a
c a b d e f
c a b d f e
c a b e d f
c a b e f d
c a b f d e
c a b f e d
c a d b e f
c a d b f e
c a d e b f
c a d e f b
c a d f b e
c a d f e b
c a e b d f
c a e b f d
c a e d b f
c a e d f b
c a e f b d
c a e f d b
c a f b d e
c a f b e d
c a f d b e
c a f d e b
c a f e b d
c a f e d b
c b a d e f
c b a d f e
c b a e d f
c b a e f d
c b a f d e
c b a f e d
c b d a e f
c b d a f e
c b d e a f
c b d e f a
c b d f a e
c b d f e a
c b e a d f
c b e a f d
c b e d a f
c b e d f a
c b e f a d
c b e f d a
c b f a d e
c b f a e d
c b f d a e
c b f d e a
c b f e a d
c b f e d a
c d a b e f
c d a b f e
c d a e b f
c d a e f b
c d a f b e
c d a f e b
c d b a e f
c d b a f e
c d b e a f
c d b e f a
c d b f a e
c d b f e a
c d e a b f
c d e a f b
c d e b a f
c d e b f a
c d e f a b
c d e f b a
c d f a b e
c d f a e b
c d f b a e
c d f b e a
c d f e a b
c d f e b a
c e a b d f
c e a b f d
c e a d b f
c e a d f b
c e a f b d
c e a f d b
c e b a d f
c e b a f d
c e b d a f
c e b d f a
c e b f a d
c e b f d a
c e d a b f
c e d a f b
c e d b a f
c e d b f a
c e d f a b
c e d f b a
c e f a b d
c e f a d b
c e f b a d
c e f b d a
c e f d a b
c e f d b a
c f a b d e
c f a b e d
c f a d b e
c f a d e b
c f a e b d
c f a e d b
c f b a d e
c f b a e d
c f b d a e
c f b d e a
c f b e a d
c f b e d a
c f d a b e
c f d a e b
c f d b a e
c f d b e a
c f d e a b
c f d e b a
c f e a b d
c f e a d b
c f e b a d
c f e b d a
c f e d a b
c f e d b a
d a b c e f
d a b c f e
d a b e c f
d a b e f c
d a b f c e
d a b f e c
d a c b e f
d a c b f e
d a c e b f
d a c e f b
d a c f b e
d a c f e b
d a e b c f
d a e b f c
d a e c b f
d a e c f b
d a e f b c
d a e f c b
d a f b c e
d a f b e c
d a f c b e
d a f c e b
d a f e b c
d a f e c b
d b a c e f
d b a c f e
d b a e c f
d b a e f c
d b a f c e
d b a f e c
d b c a e f
d b c a f e
d b c e a f
d b c e f a
d b c f a e
d b c f e a
d b e a c f
d b e a f c
d b e c a f
d b e c f a
d b e f a c
d b e f c a
d b f a c e
d b f a e c
d b f c a e
d b f c e a
d b f e a c
d b f e c a
d c a b e f
d c a b f e
d c a e b f
d c a e f b
d c a f b e
d c a f e b
d c b a e f
d c b a f e
d c b e a f
d c b e f a
d c b f a e
d c b f e a
d c e a b f
d c e a f b
d c e b a f
d c e b f a
d c e f a b
d c e f b a
d c f a b e
d c f a e b
d c f b a e
d c f b e a
d c f e a b
d c f e b a
d e a b c f
d e a b f c
d e a c b f
d e a c f b
d e a f b c
d e a f c b
d e b a c f
d e b a f c
d e b c a f
d e b c f a
d e b f a c
d e b f c a
d e c a b f
d e c a f b
d e c b a f
d e c b f a
d e c f a b
d e c f b a
d e f a b c
d e f a c b
d e f b a c
d e f b c a
d e f c a b
d e f c b a
d f a b c e
d f a b e c
d f a c b e
d f a c e b
d f a e b c
d f a e c b
d f b a c e
d f b a e c
d f b c a e
d f b c e a
d f b e a c
d f b e c a
d f c a b e
d f c a e b
d f c b a e
d f c b e a
d f c e a b
d f c e b a
d f e a b c
d f e a c b
d f e b a c
d f e b c a
d f e c a b
d f e c b a
e a b c d f
e a b c f d
e a b d c f
e a b d f c
e a b f c d
e a b f d c
e a c b d f
e a c b f d
e a c d b f
e a c d f b
e a c f b d
e a c f d b
e a d b c f
e a d b f c
e a d c b f
e a d c f b
e a d f b c
e a d f c b
e a f b c d
e a f b d c
e a f c b d
e a f c d b
e a f d b c
e a f d c b
e b a c d f
e b a c f d
e b a d c f
e b a d f c
e b a f c d
e b a f d c
e b c a d f
e b c a f d
e b c d a f
e b c d f a
e b c f a d
e b c f d a
e b d a c f
e b d a f c
e b d c a f
e b d c f a
e b d f a c
e b d f c a
e b f a c d
e b f a d c
e b f c a d
e b f c d a
e b f d a c
e b f d c a
e c a b d f
e c a b f d
e c a d b f
e c a d f b
e c a f b d
e c a f d b
e c b a d f
e c b a f d
e c b d a f
e c b d f a
e c b f a d
e c b f d a
e c d a b f
e c d a f b
e c d b a f
e c d b f a
e c d f a b
e c d f b a
e c f a b d
e c f a d b
e c f b a d
e c f b d a
e c f d a b
e c f d b a
e d a b c f
e d a b f c
e d a c b f
e d a c f b
e d a f b c
e d a f c b
e d b a c f
e d b a f c
e d b c a f
e d b c f a
e d b f a c
e d b f c a
e d c a b f
e d c a f b
e d c b a f
e d c b f a
e d c f a b
e d c f b a
e d f a b c
e d f a c b
e d f b a c
e d f b c a
e d f c a b
e d f c b a
e f a b c d
e f a b d c
e f a c b d
e f a c d b
e f a d b c
e f a d c b
e f b a c d
e f b a d c
e f b c a d
e f b c d a
e f b d a c
e f b d c a
e f c a b d
e f c a d b
e f c b a d
e f c b d a
e f c d a b
e f c d b a
e f d a b c
e f d a c b
e f d b a c
e f d b c a
e f d c a b
e f d c b a
f a b c d e
f a b c e d
f a b d c e
f a b d e c
f a b e c d
f a b e d c
f a c b d e
f a c b e d
f a c d b e
f a c d e b
f a c e b d
f a c e d b
f a d b c e
f a d b e c
f a d c b e
f a d c e b
f a d e b c
f a d e c b
f a e b c d
f a e b d c
f a e c b d
f a e c d b
f a e d b c
f a e d c b
f b a c d e
f b a c e d
f b a d c e
f b a d e c
f b a e c d
f b a e d c
f b c a d e
f b c a e d
f b c d a e
f b c d e a
f b c e a d
f b c e d a
f b d a c e
f b d a e c
f b d c a e
f b d c e a
f b d e a c
f b d e c a
f b e a c d
f b e a d c
f b e c a d
f b e c d a
f b e d a c
f b e d c a
f c a b d e
f c a b e d
f c a d b e
f c a d e b
f c a e b d
f c a e d b
f c b a d e
f c b a e d
f c b d a e
f c b d e a
f c b e a d
f c b e d a
f c d a b e
f c d a e b
f c d b a e
f c d b e a
f c d e a b
f c d e b a
f c e a b d
f c e a d b
f c e b a d
f c e b d a
f c e d a b
f c e d b a
f d a b c e
f d a b e c
f d a c b e
f d a c e b
f d a e b c
f d a e c b
f d b a c e
f d b a e c
f d b c a e
f d b c e a
f d b e a c
f d b e c a
f d c a b e
f d c a e b
f d c b a e
f d c b e a
f d c e a b
f d c e b a
f d e a b c
f d e a c b
f d e b a c
f d e b c a
f d e c a b
f d e c b a
f e a b c d
f e a b d c
f e a c b d
f e a c d b
f e a d b c
f e a d c b
f e b a c d
f e b a d c
f e b c a d
f e b c d a
f e b d a c
f e b d c a
f e c a b d
f e c a d b
f e c b a d
f e c b d a
f e c d a b
f e c d b a
f e d a b c
f e d a c b
f e d b a c
f e d b c a
f e d c a b
f e d c b a
==23746== 
==23746== HEAP SUMMARY:
==23746==     in use at exit: 110,599 bytes in 2,863 blocks
==23746==   total heap usage: 2,872 allocs, 9 frees, 112,761 bytes allocated
==23746== 
==23746== 10 bytes in 1 blocks are still reachable in loss record 1 of 6
==23746==    at 0x483A7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==23746==    by 0x10944A: next_permutation (test.c:46)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
==23746== 28 bytes in 1 blocks are still reachable in loss record 2 of 6
==23746==    at 0x483CD99: calloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==23746==    by 0x109428: next_permutation (test.c:44)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
==23746== 7,744 bytes in 704 blocks are definitely lost in loss record 3 of 6
==23746==    at 0x483A7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==23746==    by 0x109268: swap (test.c:7)
==23746==    by 0x109352: sort (test.c:20)
==23746==    by 0x1096BA: next_permutation (test.c:86)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
==23746== 7,909 bytes in 719 blocks are definitely lost in loss record 4 of 6
==23746==    at 0x483A7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==23746==    by 0x109268: swap (test.c:7)
==23746==    by 0x10962A: next_permutation (test.c:75)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
==23746== 47,454 bytes in 719 blocks are definitely lost in loss record 5 of 6
==23746==    at 0x483A7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==23746==    by 0x109530: next_permutation (test.c:62)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
==23746== 47,454 bytes in 719 blocks are definitely lost in loss record 6 of 6
==23746==    at 0x483A7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==23746==    by 0x10954C: next_permutation (test.c:63)
==23746==    by 0x1097DC: main (test.c:106)
==23746== 
==23746== LEAK SUMMARY:
==23746==    definitely lost: 110,561 bytes in 2,861 blocks
==23746==    indirectly lost: 0 bytes in 0 blocks
==23746==      possibly lost: 0 bytes in 0 blocks
==23746==    still reachable: 38 bytes in 2 blocks
==23746==         suppressed: 0 bytes in 0 blocks
==23746== 
==23746== Use --track-origins=yes to see where uninitialised values come from
==23746== For lists of detected and suppressed errors, rerun with: -s
==23746== ERROR SUMMARY: 1598 errors from 13 contexts (suppressed: 0 from 0)
4

2 回答 2

2

补充一点:

void swap(char **s, int a, int b) 
{
    char *t;
    t = malloc(11 * sizeof(char));

    t = s[a];    // Memory leak occurs at this point
    s[a] = s[b];
    s[b] = t;
}

malloc()调用分配了 11 个字节并将其分配给t局部变量,但在下一行,该值通过分配给它而被丢弃,如果曾经调用s[a],这保证是内存泄漏。swap()

于 2019-12-11T05:57:19.920 回答
2

通过换线固定,

从:

m = malloc(n + 1 * sizeof(int));

m = malloc((n + 1) * sizeof(int));
于 2019-12-11T05:41:25.240 回答