【发布时间】:2019-01-24 14:33:48
【问题描述】:
我正在尝试在“批处理文件模式”下实现自定义外壳。假设我有一个名为“batchfile”的文件,其中包含:
ls –l
pwd
ps
touch hello
ls -l ; cat file ; grep foo file2
ls -l && cat file
quit
调用./myShell batchfile,我想分别执行命令。但是,当我尝试使用 fgets() 从文件中读取行然后将它们存储到数组 (char * batch_cmds[512]) 时,我得到:
分段错误(核心转储)
这是我目前的代码:
int main(int argc, char *argv[]){
if (argc >=2){
char str[512];
char *batch_cmds[512];
int i=0;
FILE *fp;
fp = fopen(argv[1], "r");
while(fgets(str,512, fp)!=NULL){
strcpy(batch_cmds[i], str);
i++;
}
fclose(fp);
我不明白为什么会弹出这个错误。
【问题讨论】:
-
您没有为
batch_cmds分配任何内存,因此(例如)batch_cmds[0]没有指向内存中存储字符串的有效位置 -
C 使用旧式堆栈/堆内存管理,因此您需要了解指针和 malloc 的工作原理。
-
@ChrisTurner 是正确的,batch_cmds 是一个空指针,你需要管理内存或静态分配它,我建议使用链表并在成功读取一行时分配每个节点。
标签: c bash shell pointers fgets