gpt4 book ai didi

C89 : Access violation reading 0x00 (difficulty with malloc)

转载 作者:太空宇宙 更新时间:2023-11-04 05:15:38 25 4
gpt4 key购买 nike

我正在 Visual Studio 2010 Ultimate Beta (Win 7) 上开发 C89。我认为我没有正确使用 malloc()。我是 C 的新手,所以请原谅初学者问题。

我的程序的目标是使用树计算 **argv 中单词的出现次数。

hist.c

#include "tree.h"
#include <stdlib.h>

int main(int argc, char *argv[]) {
unsigned int i;
struct tree *tree;
tree = new_tree();

for (i = 1; i < argc; i++) {
tree_add(tree, argv[i]);
}

tree_dump(tree);
tree_free(tree);

return 0;
}

tree_add.c:

#include "tree.h"
#include <stdlib.h>
#include <string.h>

struct tree *tree_add(struct tree *tree, char *value) {
if (tree == NULL) {
tree = new_tree();
tree->value = value;
tree->count = 0;
}
else if (tree->value == NULL) {
tree->value = value;
}
else if (tree->value == value) {
tree->count++;
}
else if (strcmp(value, tree->value) < 0) {
tree_add(tree->left, value);
}
else if (strcmp(value, tree->value) > 0) {
tree_add(tree->right, value);
}
}

struct tree *new_tree() {
struct tree * tree;
tree = malloc(sizeof *tree);
tree->left = NULL;
tree->right = NULL;
tree->value = NULL;
tree->count = 0;
return tree;
}

我得到的错误是:

0xC0000005: Access violation reading location 0x00000000.

我在网上查了一下,这个错误似乎是由于试图访问分配不当的内存引起的。那我做错了什么?

已更新 代码以反射(reflect)评论。现在我有一个新问题。当 value == "x"tree->value == "x"

时,此条件无法正常工作
else if (tree->value == value) {

在调试器中,我看到 tree->value0x00553373 "x"char *,而 value0x00553375 "x"字符 *。最后一位的十六进制值不同。这里有什么问题?我是否错误地检查了字符串相等性?

最佳答案

这部分应该如何工作?

    if (tree == NULL) {        tree->value = value;        tree->count = 0;    }

我之所以这样问,是因为它会尽可能地尝试解除对 NULL 的引用。代码为:

    if (tree == NULL) {        (NULL)->value = value;        (NULL)->count = 0;    }

因此,当它尝试到达结构的 value 元素时,它将接收 AV。

我认为您缺少的是您需要为树中的每个 节点调用malloc()。你不能像你在这里做的那样在一开始就调用它,它只为一个节点分配足够的内存。

你的意思可能是这样的:

    if (tree->left == NULL) {        tree->left = malloc(sizeof struct tree);        tree = tree->left;    }    /* ... */

然后你的 tree_free() 函数必须以深度优先的顺序递归遍历树,首先在最靠近叶子的元素上调用 free(),在根部结束最终释放您分配的第一个 block 。

关于C89 : Access violation reading 0x00 (difficulty with malloc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2245782/

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