【问题标题】:Can't find and fix my seg fault error找不到并修复我的段错误错误
【发布时间】:2018-10-19 00:56:28
【问题描述】:

"*程序收到信号SIGSEGV,分段错误。
连接中的 0x000000000040073b (nextstr=0x7ffffffee66 "the",
longstr=0x7ffffffffe750 "", i=0x0) 在 main.c:24
24 printf("%c -> %c\n", nextstr[j], longstr[*i]);
(gdb)"

// define max for command line
#define MAX_CHARS 1000
#include <stdio.h>
int concat(char[], char[], int *);
void printreverse(char[], int);

int main(int argc, char *argv[])
{
    char longstring[MAX_CHARS] = { '\0' };
    int i = 0, j;

    if (argc < 2)
    {
        printf("%s requires command-line args\n", argv[0]);
        return 1;
    }

    for (j = 1; j <= argc; j++)
    {
        if (concat(argv[j], longstring, i))
            return 1;
    }

    i--;
    longstring[i] = '\0';    //delete trailing space
    printf("%s\n", longstring);
}

int concat(char nextstr[], char longstr[], int *i)
{
    int j = 0;

    while (nextstr[j] != '\0')
    {
        printf("%c -> %c\n", nextstr[j], longstr[*i]);
        longstr[*i] = nextstr[j];

        (*i)++;
        j++;

        if (*i > MAX_CHARS)
        {
            printf("Error: Input is too long!\n");
            return 1;
        }
    }

    if (j > 0)
    {
        if ((*i) + 2 > MAX_CHARS)
        {
            printf("Error: Input is too long!\n");
            return 1;
        }

        longstr[*i] = ' ';
        longstr[(*i) + 1] = '\0';
        (*i)++;
    }

    return 0;
}

最有可能出现指针错误

“这需要一个命令行参数是检查长度但有一个段错误”

我认为错误在第 33 行 但我不知道如何解决它

【问题讨论】:

  • 人们更有可能通过正确的代码缩进寻找/帮助。此外,您已经在代码中穿插了您的评论。您的代码的尾随部分在代码块外部,这就是为什么它出现黄色的原因[如引用的段落中],它由代码块外部的&gt; 启动。跨度>
  • 在 main 中,您将 i 传递给 concat()。首先 i 是一个 int,而不是 int*,其次因为 i 被初始化为 0,所以您传递的是一个空指针。所以带有空指针的 (*i)++ 会产生段错误。
  • 我根本不知道 c 我正在学习,所以你能用 cmets 在代码中告诉我吗
  • 我不必使用 malloc 分配内存来为指针创建内存来保存字符
  • 尝试改变这一行 "if(concat(argv[j], longstring, &i)) return 1;"在主()。 &i 会将 i 的地址传递给 concat()

标签: c segmentation-fault


【解决方案1】:

导致崩溃的主要问题在于您的 for 循环:

for(j = 1; j <= argc; j++){
    if(concat(argv[j], longstring, i)) return 1;
}

由于concat的第三个参数是一个int *,所以需要传递一个指向i的指针。此外,您在循环中迭代了太多次。如果 argc 为 2,则程序名称在 argv[0] 中,而您的参数在 argv[1] 中。因此,将循环更改为:

for(j = 1; j < argc; j++) {
    if (concat(argv[j], longstring, &i))
        return 1;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    相关资源
    最近更新 更多