c - *** `./a.out' 中的错误:realloc():下一个大小无效:0x00000000009c4010 ***
问题描述
该程序应该读取一系列数字并打印相同的序列但没有任何重复。
他们是我的问题的其他人,我确实尝试实施了这些问题中讨论的内容,但据我所知,我没有犯同样的错误,并且有很多讨论集中在我几乎不了解的主题上的。我对记忆相关的东西还是很陌生,我想一般来说编程,你可能从那个冗长的错误消息中看出我确实是个学生。任何可以提供的帮助将不胜感激。
(如果这个问题的格式不正确,我很抱歉,我对在堆栈溢出上发帖很陌生)。
代码:
#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,"
and处理两个单独的情况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(); }
.
推荐阅读
- reactjs - ReactJS:三元运算符内的映射函数
- vba - VBA - 根据长度拆分字符串
- haskell - 无法将预期类型“MultTree b”与“[MultTree b]”匹配
- mule - 我需要帮助使用 xml 格式的 dataweave 输出“大于”和“小于”字符
- loss - val loss和train loss的区别
- azure-cosmosdb - 使用 .Net SDK Microsoft.Azure.Cosmos 查询 Cosmos DB 以获取不同派生类型的列表
- javascript - 有没有办法纠正highart中显示按钮的问题?
- php - 我在哪里可以在 RegisterUser laravel 8 中找到这个类
- android - 使用 textswitcher 添加动画在 xml 布局中不起作用
- python-3.x - `__annotations__` 没有按预期返回