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修复了它。