2014-01-21 50 views
-1

我的C编程经验有点不足,我确信这件事很简单,以后我会踢自己,但我无法弄清楚。我不想发表太多的代码,但这里是什么是相关的:C细分故障结构/指针

#define MAX_COMMAND_ARGS 9 
#define MAX_COMMAND_SIZE 80 

typedef struct 
{ 
    int argc; 
    char* argv[MAX_COMMAND_ARGS + 1]; 
    char* history[MAX_COMMAND_SIZE+1]; 
    size_t size; 

} Command; 



void History(const Command* cmd) 
{ 
    for (size_t i = 0; i < cmd->size-1; ++i) 
    { 
     printf("%s\n", cmd->history[i]); 
    } 
} 

而此行另一个函数内部存在的命令中输入:

command->history[command->size] = command->argv[0]; 
++(*command).size; 

我想实现一个简单的历史命令,但每次我调用历史记录功能时都会收到一个seg故障。任何帮助,将不胜感激。

编辑:我修复了格式问题,我一直在搞printf行。这是我得到seg故障的线路:

printf("%s\n", cmd->history[i]); 
+1

那么,你不告诉我们什么行抛出异常,也没有显示任何调用History()的代码。你很可能有一个空指针或缓冲区溢出。这就是调试器存在的原因。精益如何使用它。这将是你最好的朋友。此外,您正尝试在printf中打印两个字符串,并且只有一个参数。可能是问题。 – OldProgrammer

+0

用'-Wall'编译你的软件并阅读警告。 –

+0

您是否在第一次迭代中收到seg故障? –

回答

0

分段故障通常是尝试访问CPU无法物理寻址的存储器。

Avoid using uninitialized pointer. 

使用malloc()或calloc()分配一些内存并将其分配给一个指针,然后为其分配值。

0

一个非常可能的提示是您没有为历史记录表分配内存。

尝试插入具有strdup功能的历史记录,并且不要忘记在从列表中删除条目后再调用free

如果这不是你的问题,你需要给我们更多的代码。