gpt4 book ai didi

c - C中的段错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:50 25 4
gpt4 key购买 nike

当我运行我的程序时,我收到系统崩溃“Segmentation fault”消息。

我想知道是否有一种方法可以准确地知道导致系统崩溃的指令(代码行) Segmentation fault message”

代码===>

#include "GeoIP.h"

int main()
{
FILE *f;
char ipAddress[30];
char expectedCountry[3];
char expectedCountry3[4];
const char *returnedCountry;
GeoIP *gi;
int failed = 0;
int test_num = 1;

int i;
for (i = 0; i < 2; ++i) {
if (0 == i) {
/* Read from filesystem, check for updated file */
gi = GeoIP_open("/usr/share/GeoIP/GeoIP.dat",
GEOIP_STANDARD | GEOIP_CHECK_CACHE);
} else {
/* Read from memory, faster but takes up more memory */
gi = GeoIP_open("/usr/share/GeoIP/GeoIP.dat", GEOIP_MEMORY_CACHE);
}

if (gi == NULL) {
fprintf(stderr, "Error opening database\n");
exit(1);
}

/* make sure GeoIP deals with invalid query gracefully */
returnedCountry = GeoIP_country_code_by_addr(gi, NULL);
if (returnedCountry != NULL) {
fprintf(stderr,
"Invalid Query test failed, got non NULL, expected NULL\n");
failed = 1;
}

returnedCountry = GeoIP_country_code_by_name(gi, NULL);
if (returnedCountry != NULL) {
fprintf(stderr,
"Invalid Query test failed, got non NULL, expected NULL\n");
failed = 1;
}

f = fopen("/home/aa/test/country_test.txt", "r");

while (fscanf(f, "%s%s%s", ipAddress, expectedCountry, expectedCountry3)
!= EOF) {
returnedCountry = GeoIP_country_code_by_addr(gi, ipAddress);
if (returnedCountry == NULL
|| strcmp(returnedCountry, expectedCountry) != 0) {
fprintf(stderr,
"Test addr %d for %s failed, got %s, expected %s\n",
test_num, ipAddress, returnedCountry, expectedCountry);
failed = 1;
}
returnedCountry = GeoIP_country_code_by_name(gi, ipAddress);
if (returnedCountry == NULL
|| strcmp(returnedCountry, expectedCountry) != 0) {
fprintf(stderr,
"Test name %d for %s failed, got %s, expected %s\n",
test_num, ipAddress, returnedCountry, expectedCountry);
failed = 1;
}
returnedCountry = GeoIP_country_code3_by_addr(gi, ipAddress);
if (returnedCountry == NULL
|| strcmp(returnedCountry, expectedCountry3) != 0) {
fprintf(stderr,
"Test addr %d for %s failed, got %s, expected %s\n",
test_num, ipAddress, returnedCountry, expectedCountry);
failed = 1;
}
returnedCountry = GeoIP_country_code3_by_name(gi, ipAddress);
if (returnedCountry == NULL
|| strcmp(returnedCountry, expectedCountry3) != 0) {
fprintf(stderr,
"Test name %d for %s failed, got %s, expected %s\n",
test_num, ipAddress, returnedCountry, expectedCountry);
failed = 1;
}
test_num++;
}
fclose(f);

f = fopen( "/home/aa/test/country_test2.txt", "r");
while (fscanf(f, "%s%s", ipAddress, expectedCountry) != EOF) {
returnedCountry = GeoIP_country_code_by_addr(gi, ipAddress);
if (returnedCountry == NULL
|| strcmp(returnedCountry, expectedCountry) != 0) {
fprintf(stderr, "Test addr %d %s failed, got %s, expected %s\n",
test_num, ipAddress, returnedCountry, expectedCountry);
failed = 1;
}
test_num++;
}
fclose(f);

f = fopen( "/home/aa/test/country_test_name.txt", "r");
while (fscanf(f, "%s%s", ipAddress, expectedCountry) != EOF) {
returnedCountry = GeoIP_country_code_by_name(gi, ipAddress);
if (returnedCountry == NULL
|| strcmp(returnedCountry, expectedCountry) != 0) {
fprintf(stderr, "Test addr %d %s failed, got %s, expected %s\n",
test_num, ipAddress, returnedCountry, expectedCountry);
failed = 1;
}
test_num++;
}

fclose(f);
GeoIP_delete(gi);
}
return failed;
}

谢谢

最佳答案

正如许多人所说:使用调试器或类似 valgrind 的工具。

然而,这可能肯定是问题的根源(我已经删除了不感兴趣的部分):

if (returnedCountry == NULL || ...) {
fprintf(stderr, ".. %s ..\n", returnedCountry...);
...
}

这样的例子不胜枚举。您还有 fopen 调用,您不检查返回值。 始终这样做。

关于c - C中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17593984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com