为什么这个整数会自行递减?

时间:2011-02-23 01:13:39

标签: c arrays variables pointers struct

某事告诉我,我做的事情很愚蠢。我很长时间没有做任何编程,在编写代码时感觉有点生疏。我很确定我很快就会回到编码区。

与此同时,我在使用此代码时遇到问题(特别是tab1->history_position整数):

/* 
 * 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在第65行从1递减到0。不知道为什么。请通知我。

2 个答案:

答案 0 :(得分:8)

您正在创建的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;
}

编辑:请注意更改为strlen返回的字符串长度加1。您需要它以允许终止空字符。 (许多实现都有一个strdup函数,它返回一个malloc的字符串副本,消除了这个错误,但是strdup是非标准的。)

答案 1 :(得分:2)

这是错误的:

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

你应该分配strlen(path)+1以允许\ 0适合。