Почему это целое число убывает само по себе? - PullRequest
1 голос
/ 23 февраля 2011

Что-то говорит мне, что я делаю что-то глупое. Я долгое время не занимался программированием и чувствовал себя немного ржавым при написании этого кода. Я уверен, что скоро вернусь в кодировку дзен.

А пока у меня проблемы с этим кодом (в частности, tab1->history_position integer):

/* 
 * 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 уменьшено с 1 до 0 в строке 65. Не знаю почему. Пожалуйста, сообщите мне.

Ответы [ 2 ]

8 голосов
/ 23 февраля 2011

Созданный вами dir_instance расположен в стеке.Это означает, что он недействителен после возврата dir_new_instance.Выделите его, используя malloc вместо:

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;
}

EDIT : обратите внимание на изменение, добавляющее 1 к длине строки, возвращаемой strlen.Это необходимо для разрешения завершающего нулевого символа.(Многие реализации имеют функцию strdup, которая возвращает malloc'd копию строки, устраняя эту ошибку, но strdup не является стандартным.)

2 голосов
/ 23 февраля 2011

это здесь неправильно:

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

Вы должны выделить strlen(path)+1, чтобы можно было вписать \ 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...