繁体   English   中英

指针位于本地时出现分段错误

[英]Segmentation fault when pointer is local

声明为本地时,指针出现分段错误。 该程序太长了,无法在此处复制,但它是这样的:

void f(){
    int* p;
    int n = 0;
    for (...) {
        n++;
        p = realloc(p, n * sizeof(int));
        if (p == NULL) error(); 
    }
    //Code using the pointer
    free(p);
}

int main() {
    f();
    puts("Finish");
}

puts(“ Finish”); 被执行,但是在此之后我得到了分段错误。

如果我在函数之前将p声明为全局变量,则它可以完美运行而不会出错,并且可以解决此问题,但我不知道为什么会这样。

运行调试器我看不出问题出在哪里,所有值似乎都还可以。 这是故障后的跟踪:

Program received signal SIGSEGV, Segmentation fault.
0x000000361206dbd1 in _IO_flush_all_lockp () from /lib64/libc.so.6
(gdb) bt
#0  0x000000361206dbd1 in _IO_flush_all_lockp () from /lib64/libc.so.6
#1  0x000000361206e725 in _IO_cleanup () from /lib64/libc.so.6
#2  0x00000036120334b2 in exit () from /lib64/libc.so.6
#3  0x000000361201d99b in __libc_start_main () from /lib64/libc.so.6
#4  0x0000000000400ce9 in _start ()

万一它可能是一个问题,它是一个多进程应用程序(fork,execv等)。

预先感谢您的回答

看起来您不必费心初始化p使用全局变量,它将隐式地初始化为0,而本地变量则不是。 因此,您最终会使用随机垃圾指针调用realloc / free,该指针会破坏堆并导致以后的崩溃。

初始化p并且应该修复它。

int* p;
// ...
for (...) {
//...
       p = realloc(p, n * sizeof(int));

在循环的第一次迭代中, p的值定义不正确,因为尚未初始化它。 这是一个错误。 不确定是否是造成问题的原因,但我会先修复此问题,然后查看问题是否仍然存在。

您应该检查文档中的realloc 在这里可用:

http://pubs.opengroup.org/onlinepubs/7908799/xsh/realloc.html

要带走的是,使用NULL指针(即指向0的指针realloc()调用realloc() )是有效的。 但是,使用未使用malloccalloc获得的非null指针调用它会导致“未定义”行为。

那么为什么这很重要呢? 因为当您在全局范围内声明p ,它将为您初始化为0(即NULL )。 在本地范围内声明时,不会/可能不会发生。 相反,如果您没有显式初始化它,它将仅具有一些任意的初始值,这将导致上述“未定义行为”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM