我正在编写一些简单的函数来管理图形。
当我运行我的程序时,发生以下错误:
malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *)
&((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd))))
&& old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)
((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))
+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1)))
&& ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
我执行 valgrind 并向我显示此错误:
==5903== Memcheck, a memory error detector
==5903== Invalid write of size 4
==5903== at 0x8048866: creategraph
==5903== by 0x8048718: readFile
==5903== by 0x80486BF: main
==5903== Address 0x41c3204 is 0 bytes after a block of size 4 alloc'd
==5903== at 0x4027ABA: malloc (vg_replace_malloc.c:263)
==5903== by 0x8048850: createGraph
==5903== by 0x8048718: readFile
==5903== by 0x80486BF: main
这是我的结构
typedef struct GRAPH {
int id;
int destination;
int cost;
struct GRAPH *next;
struct GRAPH *prev;
} GRAPH;
这是我的函数读取文件
void readFile() {
FILE *f = NULL;
char c;
f = fopen("g.txt", "r");
if (f == NULL) {
puts("Error");
}
int line = 0, column = 0;
g = createGraph(16);
while (!feof(f)) {
c = fgetc(f);
if (c == 'n') {
line++;
} else if (c == '1') {
createEdge(line, column, 1, g);
column++;
}
}
fclose(f);
}
这是我的函数创建图
graph **creatgraph(int tV) {
int i;
graph **v;
v = (graph**) malloc(sizeof (graph*));
if (v == NULL) {
puts("Error");
exit(EXIT_FAILURE);
}
for (i = 0; i < tV; i++) {
v[i] = NULL;
}
return v;
}
这是我的函数创建顶点
graph *createVertex() {
graph *newVertex = NULL;
newVertex = (graph*) malloc(sizeof (graph));
if (newVertex == NULL) {
puts("Error");
exit(EXIT_FAILURE);
}
newVertex->id = 0;
newVertex->destination = 0;
newVertex->cost = 1;
newVertex->next = NULL;
novoVertice->prev = NULL;
return (newVertex);
}
这是我的函数创建边缘
void createEdge(int vStart, int vFinal, int id, graph** g) {
graph *newVertex = createVertex();
newVertex->destination = vFinal;
newVertex->id = id;
g[vFinal] = insertLast(g[vStart], newVertex);
}
非常感谢您的帮助。
这里有一个内存损坏错误:
v = (graph**) malloc(sizeof (graph*));
...
for (i = 0; i < tV; i++) {
v[i] = NULL;
}
您只为一个graph*
指针分配存储空间,但将分配的块视为足够大,可以tV
此类指针。
若要修复,请将该malloc()
调用更改为:
v = (graph**) malloc(tV * sizeof (graph*));
此错误表示某处内存损坏。例如,使用 Valgrind 运行代码,以查找程序失败的地方。
您正在分配一个只有一个元素的指针数组。尝试:
graph **creatgraph(int tV) {
int i;
graph **v;
v = malloc(tV * sizeof *v);
if (v == NULL) {
puts("Error");
exit(EXIT_FAILURE);
}
for (i = 0; i < tV; i++) {
v[i] = NULL;
}
return v;
}