【发布时间】:2010-02-11 16:09:52
【问题描述】:
我正在 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:读取访问冲突 位置 0x00000000。
我在网上查了一下,这个错误似乎是由于试图访问分配不正确的内存造成的。那我做错了什么?
更新代码以反映 cmets。现在我有一个新问题。当value == "x" 和tree->value == "x" 时,此条件无法正常工作
else if (tree->value == value) {
在调试器中,我看到tree->value 是0x00553373 "x" char *,而value 是0x00553375 "x" char *。最后一位的十六进制值不同。这里有什么问题?我是否错误地检查了字符串相等性?
【问题讨论】:
-
这不是解决方案但是,如果树指针为 NULL,您不能像在 tree_add 开始时那样为 NULL 指针赋值,而且您也不会从即使您指定了 tree_add 函数应该返回一些东西,也可以使用函数?
-
另外,你在哪里 malloc 左右分支?我在任何地方都看不到...
-
如果你有一个完全不同的问题,你应该从第一个开始不连贯地发布它。否则,您将不愿意接受解决您问题的答案。无论如何,不要比较指向字符串的指针,比较内容 - 使用 strcmp() == 0 作为测试。
-
visual studio 和 Ultimate 是矛盾的
-
@Heath 好的,我以后会这样做。过去,我针对一些我认为与原始问题不同的问题提出了一个新问题,但它的投票结果被认为是欺骗性的。
标签: c malloc null-pointer