使用malloc c语言访问冲突

时间:2015-09-15 15:33:37

标签: c malloc access-violation

嘿,伙计们真的希望你能提供帮助。我和另一个人一起工作的程序在某些时候运行良好。然后有时它会崩溃,但在重新启动窗口后再次运行正常。非常间歇,现在总是崩溃。在某些时候,我想也许是因为我以某种方式升级到Windows 10(我知道)。在我的Windows 10机器上它现在总是崩溃无论如何。

所以我在我的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)修复了所有问题。

1 个答案:

答案 0 :(得分:1)

只是想回答很久以前的那个老问题,当时我还是一个菜鸟而无须回答。 (最初是通过更新问题来回答的。)

在代码的其他地方,我正在分配指向结构的指针大小的内存。 我猜想这会导致内存分配中的微小过量或未对齐。

不确定为什么,但这会导致malloc的下一次使用崩溃,但仅限于某些环境条件。

执行问题代码后很长时间发生崩溃,这使我不得不在所有错误的地方寻找问题。最终我坐下来重新编写了整个程序,直到最终我发现一行代码分配了sizeof(一个指针)。?‍?️

因此分配sizeof(实际结构)而不是sizeof(指向结构体的指针)解决了所有问题。