2011-02-23 2 views
1

뭔가 바보 같은 짓을하고있다. 나는 오랫동안 프로그래밍을 해본 적이 없으며이 코드를 작성하는 동안 조금 녹슬 었습니다. 나는 곧 코딩 선으로 돌아갈 것이라고 확신한다. 내가 할,왜이 정수는 그 자체로 감소합니까?

/* 
* Created on February 17, 2011, 1:25 AM 
*/ 

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 
#include <string.h> 


typedef struct dir_instance 
{ 
    char path[PATH_MAX]; 
    char *history[PATH_MAX/2]; 
    int history_size; 
    int history_position; 

}; 


struct dir_instance *dir_new_instance(char *path) 
{ 
    struct dir_instance inst; 
    inst.history_position=0; 
    inst.history_size=0; 

    inst.history[0]=malloc(strlen(path)); 
    strcpy(inst.history[0], path); 

    return &inst; 
} 

void dir_add_history(struct dir_instance *inst, char *dir) 
{ 
    inst->history[inst->history_position+1]=malloc(strlen(dir)+1); 
    strcpy(inst->history[inst->history_position+1], dir); 
} 



void dir_goto(struct dir_instance *inst, char *dir) 
{ 
    dir_add_history(inst, dir); 
    inst->history_position++; 
    inst->history_size++; 
} 

void dir_go_back(struct dir_instance *inst) 
{ 
    if(inst->history_position>0)inst->history_position--; 
} 

void dir_go_forward(struct dir_instance *inst) 
{ 
    if(inst->history[inst->history_position+1]!=NULL)inst->history_position++; 
} 



int main(int argc, char **argv) { 

    struct dir_instance *tab1=dir_new_instance("/"); 
    dir_goto(tab1, "/home"); 

    printf("the current directory is: %s\n",tab1->history[tab1->history_position]); 

    printf("the previous directory is: %s\n",tab1->history[tab1->history_position]); 

    return (EXIT_SUCCESS); 
} 

내가 여기에있는 것입니다 재미 어떤 사업 모르겠지만, 같은 나는 말했다 : 한편

, 나는이 코드 (특히 tab1->history_position 정수)에 문제가있어 어리석은 실수를 의심해라. 무슨 일이 일어나는 것입니까? 정수 tab1->history_position은 65 행에서 1에서 0으로 감소합니다. 이유는 알 수 없습니다. 저에게 알려주십시오.

+1

어떤 줄이 65입니까? – Tim

+0

미안하지만'printf ("현재 디렉토리는 % s \ n", tab1-> history [tab1-> history_position]);'함수'main'에서부터입니다. – Hassan

+0

'printf' 두 곳에서 같은 위치를 출력하고 있습니다. – ruslik

답변

8

작성중인 dir_instance가 스택에 할당됩니다. 즉, dir_new_instance이 반환되면 무효라는 뜻입니다.

struct dir_instance *dir_new_instance(char *path) 
{ 
    struct dir_instance* inst = (struct dir_instance*) malloc(sizeof(dir_instance)); 
    inst->history_position=0; 
    inst->history_size=0; 

    inst->history[0]=malloc(strlen(path + 1)); 
    strcpy(inst->history[0], path); 

    return inst; 
} 

편집를 : : 대신 malloc를 사용하여 할당 strlen에 의해 반환 된 문자열의 길이에 1을 추가하는 변경을합니다. 종료 널 문자를 허용하려면이 값이 필요합니다. (. 많은 구현이 오류를 제거, 문자열의 malloc이 사본을 반환하는 strdup 기능을 가지고 있지만, strdup 비 표준)

+0

'malloc'이 NULL을 반환하는지 확인해야합니다. –

+0

@ dan-breslau : 어떤 이유로 이건 컴파일되지 않습니다. 잠깐, 내가 일하도록 할 수 있는지 보자. – Hassan

+0

@Hassan : 나는 그것을 컴파일하려고하지 않았다. 그래도 문제가 지속되면 여기에 오류 메시지를 붙여 넣으십시오. –

2

이 여기하는 것은 잘못이다 :

inst.history[0]=malloc(strlen(path)); 
strcpy(inst.history[0], path); 

당신은 strlen(path)+1을 할당해야 \ 0을 넣을 수 있습니다.

+0

고마워요, 고쳐주세요! – Hassan

관련 문제