C89:액세스 위반이 읽고 0x00(과 함께 어려움 malloc)
-
20-09-2019 - |
문제
를 개발하고 C89Visual Studio2010 궁극의 베타(Win7).나는 생각하지 않는 내용 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 *
.Hex 값이 서로 다른 마지막에 자리입니다.여기서 무엇이 잘못 되었습니까?나는 검사에 대한 평등 문자열이 잘못?
해결책
이 부분은 어떻게 작동해야합니까?
if (tree == NULL) { tree->value = value; tree->count = 0; }
나는 그것이 무엇을할지 항상 가능한 경우 널리 회의를 시도하기 때문에 묻습니다. 코드는 다음과 같습니다.
if (tree == NULL) { (NULL)->value = value; (NULL)->count = 0; }
그래서 그것은 도달하려고 할 때 AV를받을 것입니다. value
구조물의 요소.
당신이 놓친 것은 당신이 전화해야한다는 것입니다. malloc()
~을 위한 각 나무의 노드. 여기에서 한 것처럼 처음에 한 번 호출 할 수 없으며, 하나의 노드에 대해 충분한 메모리 만 할당됩니다.
당신은 아마도 다음과 같은 것을 의미 할 것입니다.
if (tree->left == NULL) { tree->left = malloc(sizeof struct tree); tree = tree->left; } /* ... */
그럼 당신의 tree_free()
함수는 트리를 깊이 우선 순서대로 재귀 적으로 통과해야합니다. free()
가장 잎이 많은 요소에서 먼저, 궁극적으로 할당 한 첫 번째 블록을 풀어 뿌리를 마무리합니다.
다른 팁
몇 가지 문제 :
tree = malloc(sizeof tree);
나는 당신이 의미한다고 생각합니다 sizeof *tree
여기에서는 전체 구조물이 아니라 코드에서 포인터에 대한 공간 만 할당됩니다.
if (tree == NULL) {
tree->value = value;
tree->count = 0;
}
나무가 널 인 경우 tree->value
괜찮지 않습니다.
if (tree == NULL) {
tree->value = value;
tree->count = 0;
}
여기에 문제가 있습니다. 트리가 null이면 사용할 수 없다면 먼저 할당해야합니다.
또한 STRCMP의 반환 값을 두 번 수행하는 대신 저장해야합니다.
strcmp 기대하고 두 문자열 처리할 수 없습니다.null 입니다.Note char *c="\0"
동일하지 않은 char *c = 0
.첫 번째는 포인터를 char 배열의 단 null 요소,두 번째는 null 포인터입니다.
tree_add에서 부적절한 점검이 있습니다.
if (tree == NULL) {
tree->value = value;
tree->count = 0;
}
원래 통화에서 트리는 무일치하지 않기 때문에 트리-> 값에 쓰지 않으며 널 유지됩니다. 그런 다음 strcmp에 전화하면 Tree-> value에서 읽으려고하는 동안 액세스 위반을받습니다.
당신은 실제로 나무를 할당하지 않습니다-> 왼쪽과 나무-> 오른쪽-사용하기 전에 Malloc과 할당해야합니다.
다른 주석 외에도 'tree_add'는 트리를 반환해야하며 'tree_add'호출은 해당 결과를 저장해야합니다. (재귀적인 호출은 나무로 절약되어서는 안되지만 왼쪽/오른쪽 포인터로 저장해야합니다).