当声明为本地时,我的指针出现了分段错误。程序太长了,无法复制到这里,但它是这样的:
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等...)
提前感谢您的回答
答案 0 :(得分:6)
看起来你不需要初始化p
- 使用全局变量它将被隐式初始化为0,但本地变量不是。所以你最终使用随机垃圾指针调用realloc / free,这会破坏堆并导致以后的崩溃......
初始化p
,应该修复它。
答案 1 :(得分:1)
int* p;
// ...
for (...) {
//...
p = realloc(p, n * sizeof(int));
在循环的第一次迭代中,p
的值未定义,因为您尚未初始化它。这是一个错误。不确定这是你的问题的原因,但我先修复它,看看问题是否仍然存在。
答案 2 :(得分:0)
您应该查看realloc
的文档。它可以在这里找到:
http://pubs.opengroup.org/onlinepubs/7908799/xsh/realloc.html
要带走的是用realloc()
指针调用NULL
(即指向0的指针)是有效的。但是,使用未使用malloc
或calloc
获取的非空指针调用它会导致“未定义”行为。
那么为什么这很重要?因为当您在全局范围内声明p
时,它将被初始化为0(即NULL
)。当它在本地范围内声明时,这不会/可能不会发生。相反,它只会有一些任意的初始值,如果你没有显式初始化它,这将导致上述“未定义的行为”。