我在为大学设计一个模拟shell的项目时遇到了麻烦。用户键入命令,程序将行分为标记,并检查其中一行是否为内部命令,如cd,export,jobs和source。然后打印令牌以及在该行中找到的命令的基本说明。 当我在CodeBlocks上运行它时一切正常,但是当我在Linux上的NetBeans上编译它时,它会报告几个警告,我在代码中解释,当我运行它时会出现此消息:Segmentation Fault(core dumped)。我一直在研究它,我发现这与内存权限(访问你不允许访问的内存的一部分)有关。我找不到解决问题的方法,但我希望有人可以帮助我。谢谢!
#include <stdio.h>
#include <stdlib.h>
#define PROMPT "$"
int parse_args(char **args, char *line){
char *token;
int n=0;
token=strtok(line," "); // warning: assignment makes pointer from integer without a cast
while(token!=NULL){
printf("token%i: %s\n",n,token);
*args=token;
n++;
*args++;
token=strtok(NULL," ");// warning: assignment makes pointer from integer without a cast
}
printf("token%i: %s\n",n,token);
*args=token;
return n;
}
char *read_line(char *line){ //expecting argument char* but argument is of type char**
printf("%s ",PROMPT);
*line = malloc(sizeof(500));//warning: assignment makes pointer from integer without a cast
fgets(line,500,stdin);
return line;
}
int execute_line(char *line){//expecting argument char* but argument is of type char**
char**args;
parse_args(args,line);
check_internal(args);
return 0;
}
int check_internal(char **args){
if( strcmp(*args, "cd")==0 ){
internal_cd();
} else{
if( strcmp(*args, "export")==0 ){
internal_export();
}else{
if( strcmp(*args, "source")==0 ){
internal_source();
}else{
if( strcmp(*args, "jobs")==0 ){
internal_jobs();
}else{
printf("%s","pasa los ifelse\n");
return 0;
}
}
}
}
}
int internal_cd(char **args){
printf("%s","cambio de directorio\n");
return 1;
}
int internal_export(char **args) {
printf("%s","éste es el export\n");
return 1;
}
int internal_source(char **args) {
printf("%s","éste es el source\n");
return 1;
}
int internal_jobs(char **args){
printf("%s","éste es el jobs\n");
return 1;
}
void main(){
char *line;
while(read_line(&line)){//warning: imcompatible pointer type
execute_line(&line);//warning: incompatible pointer type
}
//free line here??
}
答案 0 :(得分:1)
你的问题是双重的。
首先,您设计的函数采用char *
但希望它接受char **
,例如
char *read_line(char *line)
和
read_line(&line);
同样适用于execute_line()
。
其次,
malloc(sizeof(500));
与
相同malloc(sizeof(int));
你想要的是
malloc(500);
as malloc()
将以字节为单位分配内存 size 的参数。