У меня возникли проблемы с проектом для университета, который состоит в моделировании оболочки. Пользователь вводит команду, а программа делит строку в токенах и проверяет, является ли одна из них внутренней командой, такой как cd, export, jobs и source. Затем печатает маркеры и основное объяснение команды, найденной в этой строке. Когда я запускаю его в CodeBlocks, все работает нормально, но когда я его компилирую на NetBeans в Linux, он сообщает о нескольких предупреждениях, которые я объясняю в коде, и когда я запускаю его, появляется следующее сообщение: Ошибка сегментации (сбрасывается ядром). Я изучал это, и я обнаружил, что это связано с разрешениями на доступ к памяти (доступ к части памяти, к которой у вас нет доступа). Я не могу найти способ его решить, но я надеюсь, что кто-то здесь может мне помочь. Благодаря!Проблема с указателями В C. Ошибка сегментации
#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??
}
Ознакомьтесь с предупреждениями, предоставленными компилятором. Попытайтесь понять, что они означают. Они действительно говорят вам, что вы делаете неправильно. Исправьте их (а не, например, кастинговые переменные, но действительно поймите, что предупреждают вам предупреждения и исправляют основную причину). –
Прочтите 'man strtok', а затем' #include ' –