gpt4 book ai didi

c - C语言使用malloc的访问冲突

转载 作者:行者123 更新时间:2023-11-30 19:15:26 24 4
gpt4 key购买 nike

我正在与另一个人合作的这个程序在某些时候运行良好。有时会崩溃,但重新启动 Windows 后又可以正常运行。非常间歇性,现在总是崩溃。在某些时候,我想可能是因为我以某种方式升级到了 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 的内容?为什么它在一台计算机上似乎工作正常,而在另一台计算机上却无法正常工作,而在另一台计算机上却出现此异常错误?

如有任何建议,我们将不胜感激。

最佳答案

只是想回答这个很久以前的老问题,当时我还是一个没有代表可以回答的菜鸟。 (最初通过问题的更新来回答)。

在代码的其他地方,我分配了指向结构的指针大小的内存。我猜这会导致内存分配出现微小的过剩或错位。

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

在问题代码执行很久之后发生的崩溃导致我在所有错误的地方寻找问题。最终我坐下来重写了整个程序,直到最终我注意到一行代码正在分配 sizeof(一个指针)。🤦‍♂️

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

关于c - C语言使用malloc的访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32590093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com