c - *** 错误 `./a.out' : realloc(): invalid next size: 0x00000000009c4010 ***

标签 c

该程序应该读取一系列数字并打印相同的序列,但没有任何重复。

他们是其他遇到我问题的人,我确实尝试并实现了这些问题中讨论的内容,但据我所知,我没有犯同样的错误,并且有很多讨论集中在我很少了解的主题上到不理解。我对与内存相关的事情仍然很陌生,我想一般来说是编程,正如你可能从那条冗长的错误消息中看出的那样,我确实是一名学生。任何可以提供的帮助将不胜感激。

(如果这个问题的格式不正确,我很抱歉,我对在堆栈溢出上发帖还很陌生)。

代码:

#include <stdlib.h>

int main(int argc, char *argv[]) {
    int len, alen = 0, temp, found = 0, *arr2;

    int *arr = calloc(alen, sizeof(int));

    scanf("%d:", &len);

    for (int i = 0; i < len; i++) {
        if (i == len-1) {
            scanf("%d", &temp);
            for (int j = 0; j < alen; j++) {
                if (temp == arr[j]) {
                    found = 1;
                }
            }
            if (found == 0) {
                alen++;
                arr2 = (int *) realloc(arr, sizeof(int)*alen);
                arr = arr2;
                arr[i] = temp;
                printf("%d ", temp);
            }
        } else {
            scanf("%d,", &temp);
            for (int j = 0; j < alen; j++) {
                if (temp == arr[j]) {
                    found = 1;
                }
            }
            if (found == 0) {
                alen++;
                arr2 = (int *) realloc(arr, sizeof(int)*alen);
                arr = arr2;
                arr[i] = temp;
                printf("%d ", temp);
            }
        }
        found = 0;
    }
    printf("\n");
    free(arr);
    return 0;
}

正常输入:

8:1,2,4,3,2,1,7,8

预期输出:

1 2 4 3 7 8

实际输出:

*** Error in `./a.out': realloc(): invalid next size: 0x00000000009c4010 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f261a3167e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x834aa)[0x7f261a3224aa]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0x179)[0x7f261a323839]
./a.out[0x400812]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f261a2bf830]
./a.out[0x400659]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:01 788482                             /home/student/impProg/lab7/noDuplicates/a.out
00600000-00601000 r--p 00000000 08:01 788482                             /home/student/impProg/lab7/noDuplicates/a.out
00601000-00602000 rw-p 00001000 08:01 788482                             /home/student/impProg/lab7/noDuplicates/a.out
009c4000-009e5000 rw-p 00000000 00:00 0                                  [heap]
7f2614000000-7f2614021000 rw-p 00000000 00:00 0 
7f2614021000-7f2618000000 ---p 00000000 00:00 0 
7f261a089000-7f261a09f000 r-xp 00000000 08:01 5251                       /lib/x86_64-linux-gnu/libgcc_s.so.1
7f261a09f000-7f261a29e000 ---p 00016000 08:01 5251                       /lib/x86_64-linux-gnu/libgcc_s.so.1
7f261a29e000-7f261a29f000 rw-p 00015000 08:01 5251                       /lib/x86_64-linux-gnu/libgcc_s.so.1
7f261a29f000-7f261a45f000 r-xp 00000000 08:01 933                        /lib/x86_64-linux-gnu/libc-2.23.so
7f261a45f000-7f261a65f000 ---p 001c0000 08:01 933                        /lib/x86_64-linux-gnu/libc-2.23.so
7f261a65f000-7f261a663000 r--p 001c0000 08:01 933                        /lib/x86_64-linux-gnu/libc-2.23.so
7f261a663000-7f261a665000 rw-p 001c4000 08:01 933                        /lib/x86_64-linux-gnu/libc-2.23.so
7f261a665000-7f261a669000 rw-p 00000000 00:00 0 
7f261a669000-7f261a68f000 r-xp 00000000 08:01 922                        /lib/x86_64-linux-gnu/ld-2.23.so
7f261a875000-7f261a878000 rw-p 00000000 00:00 0 
7f261a88d000-7f261a88e000 rw-p 00000000 00:00 0 
7f261a88e000-7f261a88f000 r--p 00025000 08:01 922                        /lib/x86_64-linux-gnu/ld-2.23.so
7f261a88f000-7f261a890000 rw-p 00026000 08:01 922                        /lib/x86_64-linux-gnu/ld-2.23.so
7f261a890000-7f261a891000 rw-p 00000000 00:00 0 
7ffca88e2000-7ffca8903000 rw-p 00000000 00:00 0                          [stack]
7ffca8921000-7ffca8923000 r--p 00000000 00:00 0                          [vvar]
7ffca8923000-7ffca8925000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
1 2 4 3 7 Aborted (core dumped)

最佳答案

arr[i] = temp;

i是对输入数字的迭代器,而不是对 arr 的迭代器。您的意思是设置最后一个新数组元素:

arr[alen - 1] = temp;

越界访问数组是未定义的行为。

几个快速注释:

  • 而不是使用 scanf("%d," 处理两个单独的案例和scanf("%d" ,就做 scanf("%d"获取号码并使用 getchar 读取逗号, 前任。 int c = getchar(); if (c != ',') { printf("End of input"); } .
  • 您的代码缺乏处理分配错误的能力。 arr = realloc(...); if (arr == NULL) { handle_error(); } .
  • 您的代码缺乏处理输入错误的能力。 int a = scanf("%d", ...); if (a != 1) { fprintf(stderr, "Wrong input\n"); abort(); } .

关于c - *** 错误 `./a.out' : realloc(): invalid next size: 0x00000000009c4010 ***,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58628974/

相关文章:

c - 尝试从文件中搜索标识号和密码

带字符串操作的 C EXC_BAD_ACCESS

c - 如何使程序输出全屏显示并着色?

C++ - 用于根据枚举类型调用函数的宏

c - 使控制台窗口右上角的关闭按钮变灰的可行方法?

c - 将数组作为参数传递给 C 中的函数

c - BUSY_TIMEOUT 在 SQLITE 中如何工作

c++ - 连接Broadcom设备解析云

c - 错误 : conflicting types

c - Makefile 未编译目录中的所有 C 文件