【发布时间】: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