【问题标题】:Trouble with pointers In C. Segmentation faultC中的指针问题。分段错误
【发布时间】:2016-11-05 20:28:47
【问题描述】:

我在一个大学项目中遇到了问题,该项目包括模拟 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??
}

【问题讨论】:

  • 阅读编译器给你的警告。试着理解它们的意思。他们真的在告诉你你做错了什么。修复它们(不是通过例如强制转换变量,而是真正了解警告告诉您的内容并修复根本原因)。
  • 阅读man strtok,然后阅读#include &lt;string.h&gt;

标签: c pointers segmentation-fault malloc fgets


【解决方案1】:

你的问题是双重的。

首先,您将函数设计为采用char *,但希望它接受char **,例如

char *read_line(char *line)

read_line(&line);

execute_line() 也一样。

其次,

 malloc(sizeof(500));

一样
malloc(sizeof(int));

你想要的是

 malloc(500);

因为malloc() 接受了要以字节为单位分配的内存的大小 参数。

【讨论】:

    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 2011-03-13
    • 2023-04-04
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2013-09-18
    • 2016-02-24
    相关资源
    最近更新 更多