【问题标题】:Struct Array Segmentation Fault结构数组分段错误
【发布时间】:2020-07-09 04:33:15
【问题描述】:

我在读取结构数组的值时一直遇到问题,我一直遇到分段错误。代码如下:

int main() 
{
    /* Get PATH Environment Variable */
    char *pathv[MAX_PATHS];
    char cmd_line[MAX_ARGS];
    struct command_t cmd[3];         //THIS IS THE STRUCT ARRAY
    size_t len = 0;

    /* Parse The Path */
    ParsePath(pathv);

    while(1) {

        /* Print Continuous Prompt */
        PrintPrompt();

        /* Read Command Line & Parse It */
        ReadCommand(cmd_line);

        ParseCommand(cmd_line, cmd);    //PASSING IT TO THIS METHOD
    }

    return 0;
}



int ParseCommand(char *buffer, struct command_t *cmd)
{
    char *name = "Test";
    cmd[0].name;  //IF THIS IS COMMENTED OUT AND THE OTHER LINE AS WELL, PROGRAM RUNS
    printf("%s\n", cmd[0].name); //FINE....THESE TWO LINES CAUSE SEG. FAULT
}

struct command_t {
    char *name;
    int argc;
    char *argv[MAX_ARGS];
};

我做错了什么?非常感谢您的帮助。

【问题讨论】:

  • 你在哪里分配给cmd[0].name
  • 您可能还想向我们展示struct command_t的定义。
  • 对不起,我刚刚添加了我的结构代码。这个结构在一个单独的头文件中!

标签: c arrays struct


【解决方案1】:

您永远不会初始化 cmd 也不会写入任何数据。访问的未初始化数据在 C 中是未定义的行为,所以是的,崩溃是有效的。在读取之前,您需要在cmd[0].name 中写入一些内容。

【讨论】:

  • 我是个白痴。我发现了问题所在...我忘了输入 = 名称...哇。对不起大家!谢谢。
【解决方案2】:

在 C 语言中,当你声明一个变量而不给它赋值时,并不意味着它是空的。它可能指向以前运行过的东西的内存垃圾。

您尝试 printf() cmd[0].name 中的内容而不初始化它可能是灾难性的。

您应该在尝试访问其值之前初始化结构中的每个变量,或者至少将所有内容填零以使其安全读取:

memset(cmd, 0, sizeof(*cmd) * 3);

【讨论】:

  • 不是零填充memset(cmd, sizeof(*cmd), 0)
  • @mLstudent33 不完全是,但是是的,在那里忘记了一个参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 2018-10-17
  • 2021-06-09
相关资源
最近更新 更多