SIGSEGV内存访问冲突

时间:2014-05-04 16:31:15

标签: c memory access-violation sigsegv

我正在用C编写一个学校项目,显然这段代码中的某些内容导致它因SIGSEGV内存访问冲突错误而崩溃,即使它编译没有任何问题。

int P, H, S, R;
char *end;

if (argc != 5){
    printf("Incorrect ammount of parameters.\n");
    exit(1);
}

errno = 0;
P=strtod(argv[2],&end);
H=strtod(argv[3],&end);
S=strtod(argv[4],&end);
R=strtod(argv[5],&end);

if (errno != 0){
    printf("Wrong input: %s\n",strerror(errno));
    exit(1);
}

//I know have only integers in P,H,S,R, that's why I can afford to do the following. Please don't judge me.
if ((H < 0) || (S < 0) || (R < 0) || (H > 5000) || ( S > 5000) || ( R > 5000)){
    printf("Incorrect waiting time H,S,R >= 0 && H,S,R < 5001\n");
    exit(1);
}

if ((P < 1) || ((P % 2)==1)){
    printf("Must be even number bigger than 0.");
    exit(1);
}

有什么想法吗? 编辑:即使我把printf放在代码的最开头我没有打印任何东西,只有内存访问冲突错误,看起来像这样

Neoprávněný přístup do paměti (SIGSEGV) (core dumped [obraz paměti uložen])

2 个答案:

答案 0 :(得分:2)

最好能够追踪发生错误的确切行。您可以在调试器中执行此操作,或者只需将printf语句放在所有位置,并查看最后一个有效的内容。

然而,从快速看,我认为问题在于:

R=strtod(argv[5],&end);

SIGSEGV(分段错误)表示您尝试了无效的内存访问。几行,您检查了argc == 5。这意味着argv的有效索引是0到4.没有argv[5],任何尝试读取它都会导致未定义的行为。

答案 1 :(得分:1)

问题在于:

if (argc != 5)
…
R=strtod(argv[5],&end);

argc == 5argv[5] == NULL。转换空指针时崩溃。您应该在strtod()argv[1]上使用argv[4]。使用strtod()将字符串转换为整数是不常见的;通常,你会使用strtol()或其亲属之一。