Has*_*san 1 c arrays variables struct pointers
有些东西告诉我,我做的事情很愚蠢.我很长时间没有做任何编程,在编写代码时感觉有点生疏.我相信我很快就会回到编码禅里.
在此期间,我遇到此代码(特别是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);
}
Run Code Online (Sandbox Code Playgroud)
我不确定这里有什么有趣的事情,但就像我说的那样,我怀疑是一个愚蠢的错误.似乎正在发生的是,整数tab1->history_position
在第65行从1减少到0.不知道为什么.请通知我.
您正在创建的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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:注意更改为添加1返回的字符串的长度strlen
.您需要它以允许终止空字符.(许多实现都有一个strdup
函数,它返回一个malloc的字符串副本,消除了这个错误,但是strdup
非标准的.)