SIGSEGV 内存访问冲突

Posted

技术标签:

【中文标题】SIGSEGV 内存访问冲突【英文标题】:SIGSEGV memory access violation 【发布时间】:2014-05-04 16:31:14 【问题描述】:

我正在用 C 语言编写一个学校项目,显然这段代码中的某些内容导致它崩溃并出现 错误,即使它编译时没有任何问题。

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])

【问题讨论】:

好吧,你没经验,好吧。谷歌“调试器”并找到适用于您的流程的一个。使用它来缩小或解决您的问题。 显然没有显示所有的代码,所以我们只能推测......你为什么不自己调试它,看看它在哪一行崩溃?顺便说一句,它被称为分段错误 请注意,您需要确保 argc 为 5,并且您正在访问 argv[5] 索引(这需要 argc == 6)。 @Cool_Coder: SIGSEGV 指的是“Segmentation Violation。注意“V”。跨度> @alk 感谢您的指点。我现在可能需要睡觉了。 【参考方案1】:

如果您能找到错误发生的确切行,那将是最好的。您可以在调试器中执行此操作,或者只需将printf 语句放在所有位置并查看最后一个有效的语句是什么。

但是,快速浏览一下,我认为问题出在:

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

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

【讨论】:

其实argv[argc]被强制为空指针不是吗?【参考方案2】:

问题出在这里:

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

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

【讨论】:

感谢您的帮助。我没有意识到这一点。

以上是关于SIGSEGV 内存访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

随机内存访问和银行冲突

c语言访问内存冲突,这该怎么办啊

访问分配的内存时出现访问冲突错误[重复]

为啥在内存位置写入访问冲突[重复]

SIGSEGV 是不是交付给每个线程?

内存违规:SIGSEGV 和“找不到虚拟表的链接器符号...”