【问题标题】:C program pointer not holding valid address still not giving segmentation faultC程序指针没有持有有效地址仍然没有给出分段错误
【发布时间】: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 标准中的一个精确的技术术语,并不意味着“未初始化”或“未指定”。标准准确地指定了哪些是未定义行为的来源。例如,取消引用无效指针是未定义行为的来源。

标签: c pointers


【解决方案1】:

这取决于“cantcatch”的值 - 这是未定义的(随机值)。 如果该值超出程序的内存范围 - 那么程序将出现段错误。

如果它在您的程序范围内,则程序不会崩溃,但可能会导致内存损坏。

这些无效的读/写很容易被“Valgrind”等内存分析工具捕获。

【讨论】:

  • random value表示这段代码的多次运行至少在某个时候可能会导致段错误?
  • 不仅值未定义,整个程序都是。
  • 理论上是的。然而,这个值总是有可能不是完全随机的(例如,每次执行时都是完全相同的随机值)——你可以在每次运行时打印指针的值——看看会发生什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多