2016-11-05 10 views
0

У меня возникли проблемы с проектом для университета, который состоит в моделировании оболочки. Пользователь вводит команду, а программа делит строку в токенах и проверяет, является ли одна из них внутренней командой, такой как 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?? 
} 
+1

Ознакомьтесь с предупреждениями, предоставленными компилятором. Попытайтесь понять, что они означают. Они действительно говорят вам, что вы делаете неправильно. Исправьте их (а не, например, кастинговые переменные, но действительно поймите, что предупреждают вам предупреждения и исправляют основную причину). –

+2

Прочтите 'man strtok', а затем' #include ' –

ответ

1

Ваша проблема двоякая.

Во-первых, вы проектируете функцию взять char *, но ожидаем, что он принимать char **, как

char *read_line(char *line) 

и

read_line(&line); 

То же самое относится и к execute_line() тоже.

Во-вторых,

malloc(sizeof(500)); 

точно такой же, как

malloc(sizeof(int)); 

То, что вы хотите вместо этого

malloc(500); 

, как malloc() принимает аргумент для размера памяти до выделяться в байтах.

 Смежные вопросы

  • Нет связанных вопросов^_^