문제

를 개발하고 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->value0x00553373 "x" char *, 반면 value0x00553375 "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'호출은 해당 결과를 저장해야합니다. (재귀적인 호출은 나무로 절약되어서는 안되지만 왼쪽/오른쪽 포인터로 저장해야합니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top