C程序指针没有保持有效地址仍然没有给出分段错误

时间:2015-07-25 18:48:40

标签: c pointers

C程序中的分段错误错误发生是因为我们尝试访问未分配给当前程序资源的地址。

我试图通过以下代码获取分段错误错误。而且我无法理解为什么在main函数中最后一次调用函数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'指针,则会出现此分段错误错误。

任何理解这一点的提示都会非常有用。

1 个答案:

答案 0 :(得分:3)

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

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

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