2014-01-21 83 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

如果這不是你的問題,你需要給我們更多的代碼。