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。
オンラインで調べたところ、このエラーは不適切に割り当てられたメモリにアクセスしようとしたことが原因のようです。だから私は何が間違っているのですか?
コメントを反映するように更新されたコード。今、私は新しい問題を抱えています。value == "x"
この状態は、次の場合に正しく機能しません。tree->value == "x"
else if (tree->value == value) {
デバッガーでtree->value
は0x00553373 "x" char *
、それはですが、value
はです0x00553375 "x" char *
。16進値は最後の桁で異なります。ここで何が問題になっていますか?文字列の同等性を誤ってチェックしていますか?