- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我不确定我是否在这里遗漏了什么,但是当我尝试收缩动态结构数组时,realloc() 因大小无效而失败。我从代码中删除了非必要的功能以发布:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char const file_name[] = "animals.dat";
typedef enum {
false, true } bool;
typedef struct {
char month;
char day;
short year;
} date;
typedef struct {
bool parvo_vacc;
bool fip_vacc;
bool rabies_vacc;
bool has_mc;
bool worm_vacc;
} md_history;
typedef struct {
int id;
char age;
char name[25];
char description[50];
md_history medical;
date intake_date;
date adopt_date;
} animal;
void lookup(animal* list, int size);
int compare(const void* this, const void* that);
void sort(animal* list, int size);
//this brings the new name back with it, since it isnt saved correctly
//in the new animal
animal* add(char* name);
void del(animal* list, int size);
void print_results(animal** results, int size);
void print_animal(animal* print);
void swap(animal* this, animal* that);
int main(int argc, char **argv)
{
FILE* readfile = fopen(file_name, "r");
if (readfile == NULL)
{
printf("Error file not found: %s\n", file_name);
}
//read data using fread(), keeping track of the number
//of bytes missed
int num_animals = 0;
fread(&num_animals, sizeof(int), 1, readfile);
animal* animal_list = (animal*) calloc(num_animals, sizeof(animal));
int errnum = num_animals - (fread(animal_list,
sizeof(animal), num_animals, readfile));
if (errnum > 0)
{
printf("Read encountered %d errors", errnum);
}
fclose(readfile);
char c;
char* name = malloc(sizeof(char) * 25);
//switch statements dont allow declarations for whatever reason
int x;
while(c != 'q')
{
printf("Options: (l)ookup (s)ort (a)dd (d)elete (p)rint (q)uit (e)dit\n");
scanf(" %c", &c);
switch (c)
{
case 'l':
lookup(animal_list, num_animals);
break;
case 's':
sort(animal_list, num_animals);
break;
case 'p':
for (x = 0; x < num_animals; x++)
{
print_animal(&animal_list[x]);
}
break;
case 'a':
//after dealing with lots of iostream errors trying to
//set the name field in add(), i decided to just return
//the new name to here and strcpy it
animal_list = realloc(animal_list, sizeof(animal) * (num_animals + 1));
swap(&animal_list[num_animals], add(name));
strcpy(animal_list[num_animals].name, name);
num_animals++;
//memory leak here, since switch statements dont allow
//declarations, i cant save the new animal pointer to a temp
//var so it can be deleted
break;
case 'd':
del(animal_list, num_animals);
num_animals--;
break;
}
}
return 0;
}
void swap(animal* this, animal* that)
{
animal temp;
temp.id = this->id;
strcpy(temp.name, this->name);
temp.age = this->age;
strcpy(temp.description, this->description);
temp.medical.fip_vacc = this->medical.fip_vacc;
temp.medical.has_mc = this->medical.has_mc;
temp.medical.parvo_vacc = this->medical.parvo_vacc;
temp.medical.rabies_vacc = this->medical.rabies_vacc;
temp.medical.worm_vacc = this->medical.worm_vacc;
temp.intake_date.day = this->intake_date.day;
temp.intake_date.month = this->intake_date.month;
temp.intake_date.year = this->intake_date.year;
temp.adopt_date.day = this->adopt_date.day;
temp.adopt_date.month = this->adopt_date.month;
temp.adopt_date.year = this->adopt_date.year;
this->id = that->id;
strcpy(this->name, that->name);
this->age = that->age;
strcpy(this->description, that->description);
this->medical.fip_vacc = that->medical.fip_vacc;
this->medical.has_mc = that->medical.has_mc;
this->medical.parvo_vacc = that->medical.parvo_vacc;
this->medical.rabies_vacc = that->medical.rabies_vacc;
this->medical.worm_vacc = that->medical.worm_vacc;
this->intake_date.day = that->intake_date.day;
this->intake_date.month = that->intake_date.month;
this->intake_date.year = that->intake_date.year;
this->adopt_date.day = that->adopt_date.day;
this->adopt_date.month = that->adopt_date.month;
this->adopt_date.year = that->adopt_date.year;
that->id = temp.id;
strcpy(that->name, temp.name);
that->age = temp.age;
strcpy(that->description, temp.description);
that->medical.fip_vacc = temp.medical.fip_vacc;
that->medical.has_mc = temp.medical.has_mc;
that->medical.parvo_vacc = temp.medical.parvo_vacc;
that->medical.rabies_vacc = temp.medical.rabies_vacc;
that->medical.worm_vacc = temp.medical.worm_vacc;
that->intake_date.day = temp.intake_date.day;
that->intake_date.month = temp.intake_date.month;
that->intake_date.year = temp.intake_date.year;
that->adopt_date.day = temp.adopt_date.day;
that->adopt_date.month = temp.adopt_date.month;
that->adopt_date.year = temp.adopt_date.year;
}
void del(animal* list, int size)
{
printf("Delete by: (n)ame (i)d\n");
char c;
while (getchar() != '\n');
scanf("%c", &c);
animal* to_delete = NULL;
if (c == 'n')
{
printf("Enter name to delete: ");
char to_search[25];
while (getchar() != '\n');
scanf(" %s", to_search);
int x;
for (x = 0; x < size; x++)
{
if (strcmp(to_search, list[x].name) == 0)
{
to_delete = &list[x];
}
}
}
if (c == 'i')
{
printf("Enter ID to delete: ");
int to_search;
while (getchar() != '\n');
scanf("%d", &to_search);
int x;
for (x = 0; x < size; x++)
{
if (to_search == list[x].id)
{
to_delete = &list[x];
}
}
}
swap(to_delete, &list[size);
list = realloc(list, sizeof(animal) * (size - 1)); //fails right here
}
我是否错误地缩小了数组?我在这里很困惑
编辑:我知道 realloc() 失败了,因为它做得非常好并中止,给出了这条消息:
*** Error in `./final': realloc(): invalid next size: 0x0000000000c11250 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x77725)[0x7f6ae72ba725]
/lib/x86_64-linux-gnu/libc.so.6(+0x82bfa)[0x7f6ae72c5bfa]
/lib/x86_64-linux-gnu/libc.so.6(+0x85179)[0x7f6ae72c8179]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0x22f)[0x7f6ae72c6e6f]
./final[0x401d3e]
./final[0x400b82]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f6ae7263830]
./final[0x400849]
======= Memory map: ========
00400000-00403000 r-xp 00000000 08:01 3146140 /home/destrovel/cppwork/final
00602000-00603000 r--p 00002000 08:01 3146140 /home/destrovel/cppwork/final
00603000-00604000 rw-p 00003000 08:01 3146140 /home/destrovel/cppwork/final
00c10000-00c31000 rw-p 00000000 00:00 0 [heap]
7f6ae0000000-7f6ae0021000 rw-p 00000000 00:00 0
7f6ae0021000-7f6ae4000000 ---p 00000000 00:00 0
7f6ae702d000-7f6ae7043000 r-xp 00000000 08:01 1069105 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f6ae7043000-7f6ae7242000 ---p 00016000 08:01 1069105 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f6ae7242000-7f6ae7243000 rw-p 00015000 08:01 1069105 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f6ae7243000-7f6ae7403000 r-xp 00000000 08:01 1049974 /lib/x86_64-linux-gnu/libc-2.23.so
7f6ae7403000-7f6ae7602000 ---p 001c0000 08:01 1049974 /lib/x86_64-linux-gnu/libc-2.23.so
7f6ae7602000-7f6ae7606000 r--p 001bf000 08:01 1049974 /lib/x86_64-linux-gnu/libc-2.23.so
7f6ae7606000-7f6ae7608000 rw-p 001c3000 08:01 1049974 /lib/x86_64-linux-gnu/libc-2.23.so
7f6ae7608000-7f6ae760c000 rw-p 00000000 00:00 0
7f6ae760c000-7f6ae7632000 r-xp 00000000 08:01 1049970 /lib/x86_64-linux-gnu/ld-2.23.so
7f6ae77f9000-7f6ae77fc000 rw-p 00000000 00:00 0
7f6ae782e000-7f6ae7831000 rw-p 00000000 00:00 0
7f6ae7831000-7f6ae7832000 r--p 00025000 08:01 1049970 /lib/x86_64-linux-gnu/ld-2.23.so
7f6ae7832000-7f6ae7833000 rw-p 00026000 08:01 1049970 /lib/x86_64-linux-gnu/ld-2.23.so
7f6ae7833000-7f6ae7834000 rw-p 00000000 00:00 0
7ffd8a23b000-7ffd8a25c000 rw-p 00000000 00:00 0 [stack]
7ffd8a331000-7ffd8a333000 r--p 00000000 00:00 0 [vvar]
7ffd8a333000-7ffd8a335000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)
我按照 2501 的建议重写了将列表传回调用函数的函数,但它并没有改变在同一位置中止的程序
此外,gdb 在评估该行时给出:
realloc: Assertion `ptr == alloc_last_block' failed!
编辑 2:经过大量调试后,是 swap() 破坏了堆,但我不知道为什么。我按照建议重写了 swap(),但是紧随其后的 realloc() 失败,而紧接其前的 realloc() 却没有
最佳答案
变量在 C 中按值传递。
传递给函数del
的指针list
在函数中被realloc改变了,但是函数外的指针没有改变。导致的未定义行为。
指针animal_list
,在此处传递:
del(animal_list, num_animals);
指针 list
的副本在此处更改:
list = realloc(list, sizeof(animal) * (size - 1));
原始指针animal_list
保持不变。
要解决此问题,请返回新指针列表的值。
关于c - realloc 收缩失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36898413/
我对 ScalaCheck(以及整个 Scala)相当陌生,所以这可能是一个相当简单的解决方案 我正在使用 ScalaCheck 为 AST 生成测试并验证编写器/解析器是否工作。我有这些文件 AST
我首先创建一个特定大小的 JTextArea。用户可以在其中添加文本,但如果它变得太长(垂直或水平),它将被截断。我希望 JTextArea 自动扩展或收缩(用于删除文本)。 我将来可能会允许用户更改
我正在学习如何在浏览器更改大小时调整 div 元素的大小。我希望我的 slider (参见 Fiddle)始终显示 10 张幻灯片,即使浏览器变小(参见下图)也是如此。 目标: 我能想到的实现这一点的
嗨,我在使用 css 面板时遇到了一些问题,我有点想寻求帮助,我的代码运行良好,但是如果用户让浏览器缩小尺寸,面板就会出现在文本下面,这就是我的意思意思是: 这是正常浏览器大小下的样子: 如果用户将浏
我正在研究和实现事件轮廓的贪婪算法,如 Donna Williams 的论文 - 事件轮廓和曲率估计的快速算法中所述。 与另一种实现(Kass 等人的实现)相比的优势之一应该是沿等高线曲线的点均匀分布
在 PHP 中,如何复制 tinyurls 的扩展/收缩功能,就像在 search.twitter.com 上一样? 最佳答案 如果你想找出一个 tinyurl 的去向,使用 fsockopen 在端
有java.io.ZipInputStream膨胀和java.io.ZipOutputStream这会泄气。 但有时我不希望这样。有时,当使用接受 InputStream 的第三方 API 时,我想要
我试图做到这一点,以便在选择文件后,显示文件路径的文本字段会自动收缩/扩展以适合路径。 JFileChooser fileChooser = new JFileChooser(); if (fileC
我有两个 flexbox,它们在高度变化时收缩,嵌套内容重叠。 如何防止这种情况? 最佳答案 just add flex-shrink:0 to your element and the flexbo
想要逐渐“打开”和“关闭”表格中的行,适本地向下推或拉起下面的行。 我能够通过使用 transition 进行计时和使用 transform 进行大小调整来使 div 扩展/收缩(无法使用 heigh
我有一个10列24行的表,可以存储一个值,也可以是=0。它们被称为msg1,msg2...直到msg10。我正在编写一个查询,用 0 而不是任何字段中的特定值来更新此表。 所以我写了(59是一个测试值
有谁知道缩小/压缩 db4o 数据库的方法吗? 最佳答案 压缩/收缩是什么意思?缩小现有数据库?还是要压缩数据库? 其中一个角色是 defragmentation .这将释放数据库中未使用的空间。删除
我正在使用 flexbox 来布局页面,因为 growing 行为很有用。但我想完全防止收缩行为。 无论如何要管理这个? 示例代码: This one should gr
我是 jQuery/Javascript 的新手,甚至是通过缩小的 jQuery/Javascript 进行搜索的新手。 我正在尝试重新创建我在 Materialize 框架的表单组件中找到的一些功能
我有一个对象表及其类型,如下所示: objectType | object 107 Boeing 107 Airbus 323 Audi 323
我正在尝试使用以编程方式构建的 TableLayout 将 20x20 表格放入 View 中。 setStretchAllColumns/setShrinkAllColumns 方法非常适合压缩所有
我有一个 QDialog 和一个 QVBoxLayout 控制它的高度。 这个主要的 QVBoxLayout 由一个或多个 QVBoxLayout child 组成,后面是一些其他小部件。当我添加额外
如何缩小任意(未指定)宽度的居中图像周围的 anchor (绿色边框)?换句话说,我想要绿色边框居中的秒框,就像第一个一样。没有 float ,没有绝对定位。 移除行 (A) 中心,但 anchor
我正在制作一款安卓游戏。我在 Galaxy sII 上测试我的应用程序。我取得了很大进步。不幸的是,我忽略了对其他设备进行测试。我知道我会遇到不同类型设备的不同分辨率问题。但我认为我可以通过安排我的坐
如果 GUI 设计人员使用特定设备屏幕尺寸作为引用点提供 iOS 设计,那么如果应用程序在不同设备上运行,如何使字体扩展或收缩? 即假设设计者提供了一个以 iPhone 8 屏幕尺寸为引用的单一设计,
我是一名优秀的程序员,十分优秀!