【问题标题】:C - Segmentation fault raised before the actual point of issue [duplicate]C - 在实际问题点之前提出的分段错误[重复]
【发布时间】:2018-04-16 21:34:23
【问题描述】:

我正在调试一些 C 代码,它给了我一个分段错误。我试图通过使用 printf()s 来定位问题。

但是,即使我将问题范围限定在两个 printf() 之间,我也无法推断出问题所在,因为这两个 printf()s 只是一个简单的指针声明。

最后,我使用 gdb 来实际调试并查看发生了什么。我发现分段错误是由于在第二个 printf() 之后某处出现无限循环。

我一直认为使用 **printf()**s 来本地化 seg-faults 是简单程序的一种简单方法。但似乎没有。

有人可以解释这种行为吗?它是某种编译器优化的结果吗?还是与我的代码本身的结构有关?

我正在测试的代码如下。
Seg-Fault 发生在 ----BEGIN---------END----- printf 之间来电。
实际问题在于最后一个 while 循环,它变成了一个无限循环。

我希望这是一个合法的问题,以前没有问过。

void Replace(char *name,char *newname,char record[]) {
    printf("CAME\n");
    char *tempRecord = record;

    printf("This too\n");
    char *newRecord = newname;

    printf("----BEGIN-----\n");
    char *q;
    printf("----END-----\n");
    int i = 0;

    printf("HERE 1");
    while(*(tempRecord+i) != '\0') {
        if(*(tempRecord+i) == ','){
            q = tempRecord+i;
            break;
        }
        i++;
    }

    int j = 0;
    printf("HERE 2");
    while(j >= 0) {
        if(*(newname + j) == '\0') {    
            break;
        }
        j++;
    }
    int a =0;

    printf("HERE 3");
    while (*(q+a) != '\n') {
        *(newname + j + a) = *(q+a);
        a++;
    }

    printf("HERE 4");
    int b = 0;
    while (*newname != '\n'){
        *(record + b) = *(newname + b);
        b++;
    }

    printf("%s",record);
}

编辑:添加更多源代码

void main(void) {
    char arrayName[100];
    char arrayNewname[100];
    char *name = arrayName;
    char *newname = arrayNewname;
    char record[1000];
    printf("Please enter a name in the phonebook: ");
    scanf("%s",name);
    printf("Please enter the replacement name: ");
    scanf("%s",newname); 

    FindRecord("PhoneBook.csv",name,record);
    // records in csv are formatted as: "Bobby, 26, 5145480546"
    // The above method copies the matching record in csv into record[]
    printf("%s\n",record);

    Replace(name, newname,record);
}

谢谢
沙比尔

【问题讨论】:

  • 您需要发布如何调用此函数以及它崩溃的输入。根据输入,这里有几行可能有问题也可能没有问题。
  • 您知道这不会复制任何数据,对吧? char *newRecord = newname;它只复制数据的地址(指针)。
  • @MFisherKDX 是的,我知道这是地址副本。让我看看能不能把整个代码贴在这里。
  • @MFisherKDX 添加了更多代码。让我知道是否需要添加更多内容。
  • 您后来的许多打印中都没有换行符,这让您很难判断它们是否已执行。此外,您没有准确地说明您看到的输出,只是说明您的结论是错误发生在两个printf 调用之间。很容易得出错误的结论。

标签: c debugging segmentation-fault


【解决方案1】:

这个问题不是很清楚,但我给出了一个答案来解释为什么会在这一行弹出分段错误。您是否在某处定义了堆栈地址和大小?听起来您有问题,因为堆栈数据存储在不可访问的内存中(很可能是 0 ) 添加 printf 是一种侵入性方法,尤其是在嵌入式系统上,因此您正在使用更多资源(堆)并因此修改代码行为。 对于在真正根本原因之前看到分段错误的事实,您是否使用编译选项标志-0x?你的目标是什么(x86、arm、..)?

【讨论】:

  • 我们读的是同一个问题吗??
【解决方案2】:

这里是关于使用printf() 调试分段错误的问题的链接。

Execution of printf() and Segmentation Fault

在要打印的行之后使用fflush(stdout);。这样可以确保始终打印该行。在 printf() 中有一个换行符并不总是保证该行被打印。

【讨论】:

  • 虽然理论上可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。如果您只是引用另一个 SO 问题,请将其标记为重复,而不是发布答案。
  • 这基本上回答了我遇到的大部分难题。如果对我得到的没有其他解释,这对我来说似乎是合法的。
  • 我在跟踪分段错误时遇到了类似的问题,据我所知,使用 gdb 之类的调试器是查找分段错误的最佳方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 2012-05-26
  • 2018-12-11
  • 1970-01-01
  • 2011-02-21
  • 2013-10-23
相关资源
最近更新 更多