【发布时间】:2015-07-25 18:48:39
【问题描述】:
C 程序中出现分段错误错误是因为我们尝试访问未分配给当前程序资源的地址。
我试图使用以下代码获取分段错误错误。而且我无法理解为什么在主函数中最后一次调用函数 check() 没有给出分段错误。
#include <stdio.h>
int check(char * memptr);
int foo(char * memptr);
int main()
{
char mem = 'a';
char * memptr = NULL;
char * cantcatch;
check(&mem); // valid pointer
check(memptr); // error case, but can be checked
check(cantcatch); // error case, but can't catch
return 0;
}
int check(char * memptr)
{
if (NULL == memptr)
{
printf("\n error, function foo() not called \n");
return 1;
}
else
{
printf("\n After = %c, ret val = %d, Before = %c, Before = %d \n", \
*memptr, foo(memptr), *memptr, *memptr);
}
return 0;
}
int foo(char * memptr)
{
*memptr = 'b';
return 0;
}
如果我尝试打印 'memptr' 指针,则会出现此分段错误错误。
任何有助于理解这一点的提示都会非常有帮助。
【问题讨论】:
-
您还没有初始化
cantcatch,因此无论您尝试使用它做什么都是未定义的。这并不意味着它会导致段错误:行为未定义。 -
我喜欢未定义的行为定义总是以“[...] 表示行为未定义”结尾。 :)
-
behaviour is undefined 的意思,你能详细解释一下吗?
-
behaviour is undefined 意味着 C 标准没有指定在这些情况下会发生什么:@Tomer 的回答说得很好,尽管可能不止他陈述了两个结果。
-
@Mithun "Undefined" 这里指的是“未定义的行为”,这是 C 标准中的一个精确的技术术语,并不意味着“未初始化”或“未指定”。标准准确地指定了哪些是未定义行为的来源。例如,取消引用无效指针是未定义行为的来源。