C 指针为本地时出现分段错误

C 指针为本地时出现分段错误,c,debugging,segmentation-fault,C,Debugging,Segmentation Fault,当指针被声明为本地指针时,我得到了一个分段错误。程序太长,无法复制到这里,但它是这样的: 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() {

当指针被声明为本地指针时,我得到了一个分段错误。程序太长,无法复制到这里,但它是这样的:

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");
}
看跌期权(“完成”);执行,但在此之后我得到了一个分段错误

如果我将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
。可在以下位置获取:

需要注意的是,使用
NULL
指针(即指向0的指针)调用
realloc()
是有效的。但是,使用非空指针调用它会导致“未定义”行为,该指针不是使用
malloc
calloc
获得的


那么,这有什么关系呢?因为当您在全局范围中声明
p
时,它将为您初始化为0(即
NULL
)。当它在本地范围内声明时,不会/可能不会发生这种情况。相反,如果不显式初始化它,它将只具有一些任意的初始值,这将导致前面提到的“未定义行为”

谢谢,这就是问题所在。一个简单的int*p=NULL修复了它。