所以我在我的Windows 7机器上安装了VS并再次获得了不同的行为。
因此它运行正常,但如果没有调试就运行,则不显示输出。
如果我在调试时运行,它会在下一段代码中分配内存时触发一个未处理的异常断点。
/*
* clone()
* Precondition: s is defined and not NULL
* Postcondition: a copy of s has been returned
* Informally: Clone a sample
*/
sample clone(sample s)
{
sample c;
c = (sample)malloc(sizeof(struct sample_int)); //<-----exception error
c->name = (char *)malloc((strlen(s->name) + 1)*sizeof(char));
strcpy(c->name, s->name);
c->sequence = (char *)malloc((strlen(s->sequence) + 1)*sizeof(char));
strcpy(c->sequence, s->sequence);
c->match = s->match;
return c;
}
点击“继续”时,我在位置发生了访问冲突...错误。
在此阶段,它是第二次调用该函数。下面是sample.c的头文件。
/*
* Specification for the Sample ADT
* Author Julian Dermoudy
* Version 20/8/15
*/
#ifndef SAMPLE_H
#define SAMPLE_H
struct sample_int;
typedef struct sample_int *sample;
void init_sample(sample *s, char *name, char *sequence);
char *getName(sample s);
char *getSequence(sample s);
int getMatch(sample s);
void setName(sample s, char *name);
void setSequence(sample s, char *name);
void setMatch(sample s, int m);
sample clone(sample s);
char *toString(sample s);
#endif
克隆函数将现有的样本结构与所有领域中的数据结合起来
我错过了关于malloc的一些事情吗?为什么它似乎在1台计算机上运行正常,而在另一台计算机上却出现这种异常错误?
非常感谢任何建议。
想到没有人正在阅读这个,但很高兴自己有一个记录:)我正在慢慢解决我自己的问题,而且我自己重写了整个团队项目。
问题出在初始化样本的函数中。
void init_sample(sample *s, char *name, char *samp)
{
*s = (sample)malloc(sizeof(sample));
(*s)->name = name;
(*s)->sequence = samp;
//(*s)->match=0; //<--here.
}
因此,由于某种原因,将默认值设置为0将导致任何函数中的下一个malloc调用触发访问冲突。我认为它必须与结构的所有元素都是指针但不匹配的事实有关。
我可以在初始化样本后设置驱动程序文件中的匹配值,一切都很好但是如果我在初始化中设置它,则会根据运行它的计算机获得不同的行为。有些崩溃有些只是没有输出,有些仍然因某些原因而起作用。
所以我想我现在的问题是..如何通过结构指针在结构中设置一个值?
更新:我最终发现了这个问题。其中一个函数是分配内存,样本的大小是指向结构的指针,而不是分配结构本身的大小。由于某些原因,除非从初始化它的函数中访问结构中的值,否则根本不会产生任何问题。 Witch反过来会让malloc的下一次使用崩溃程序。从驱动程序c文件访问结构的位置很好。
所以我的猜测是因为我正在分配struct指针的内存大小而不是struct的大小在内存分配中分配了一点点过多或不对齐。
因此,分配sizeof(实际结构)而不是sizeof(the_pointer)修复了所有问题。
答案 0 :(得分:1)
只是想回答很久以前的那个老问题,当时我还是一个菜鸟而无须回答。 (最初是通过更新问题来回答的。)
在代码的其他地方,我正在分配指向结构的指针大小的内存。 我猜想这会导致内存分配中的微小过量或未对齐。
不确定为什么,但这会导致malloc的下一次使用崩溃,但仅限于某些环境条件。
执行问题代码后很长时间发生崩溃,这使我不得不在所有错误的地方寻找问题。最终我坐下来重新编写了整个程序,直到最终我发现一行代码分配了sizeof(一个指针)。??️
因此分配sizeof(实际结构)而不是sizeof(指向结构体的指针)解决了所有问题。