我正在Visual Studio 2010 Ultimate Beta(Win 7)上开发C89。我不认为我正确使用malloc()
。我是C新手,请原谅初学者问题。C89:访问冲突读取0x00(与malloc的难度)
我的程序的目标是使用树计算**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;
}
我得到的错误是:
0000005:访问冲突读取 位置00000000。
我在网上查看,看起来这个错误是由于试图访问不正确分配的内存引起的。那么我做错了什么?
已更新反映评论的代码。现在我有一个新问题。当value == "x"
和tree->value == "x"
else if (tree->value == value) {
在调试器中,我看到tree->value
是0x00553373 "x" char *
,而value
是0x00553375 "x" char *
这种情况是不正常。十六进制值在最后一位数字中不同。这里有什么问题?我是否错误地检查字符串相等?
这不是解决方案但是, 您不能像在tree_add的开始中那样将值指定给NULL指针如果树指针为NULL,也不会返回函数的任何指针,即使您指定tree_add函数应该返回一些东西? – Henrik 2010-02-11 16:18:25
另外,你在哪里malloc左右分支?我无法在任何地方看到...... – Henrik 2010-02-11 16:22:20
如果您有完全不同的问题,那么您应该从第一个问题中分离出来。否则,你不愿意接受解决你的问题的答案。无论如何,不要比较指向字符串的指针,比较内容 - 使用strcmp()== 0作为测试。 – 2010-02-11 17:31:32