2016-09-18 29 views
1

我解决了编程网站上的问题,但是当我输入n = 2147483647 那么它给出了分段错误(核心转储)?为什么分段故障(cored dumped)?

int integerReplacement(int n) { 
    if(n == 1) 
    return 0; 
    if(n%2 == 0) 
    { 
    return 1+integerReplacement(n/2); 
    } 
    else 
    { 
    int lMin = 1+integerReplacement(n-1);  
    int rMin = 1+integerReplacement(n+1); 
    return lMin<rMin?lMin:rMin; 
    } 
} 
+4

堆栈溢出? – Raman

+9

当递归收到你声明的参数'2147483647'时,那么'integerReplacement(n + 1);'是*未定义的行为*,因为'n'现在超出整数范围。 –

回答

0

作为风向标正确地指出,INT_MAX + 1让你未定义行为。

这里是你怎么会想通了这一点:

gcc -g foo.c 
gdb -q ./a.out 
(gdb) r 
Starting program: /tmp/a.out 

Program received signal SIGSEGV, Segmentation fault. 
0x00000000004004f5 in integerReplacement (n=<error reading variable: Cannot access memory at address 0x7fffff7fefec>) at foo.c:1 
1 int integerReplacement(int n) { 
(gdb) bt 6 
#0 0x00000000004004f5 in integerReplacement (n=<error reading variable: Cannot access memory at address 0x7fffff7fefec>) at foo.c:1 
#1 0x0000000000400522 in integerReplacement (n=-2) at foo.c:6 
#2 0x0000000000400534 in integerReplacement (n=-1) at foo.c:10 
#3 0x0000000000400522 in integerReplacement (n=-2) at foo.c:6 
#4 0x0000000000400534 in integerReplacement (n=-1) at foo.c:10 
#5 0x0000000000400522 in integerReplacement (n=-2) at foo.c:6 
(More stack frames follow...) 

(gdb) bt -10 
#174684 0x0000000000400522 in integerReplacement (n=-16777216) at foo.c:6 
#174685 0x0000000000400522 in integerReplacement (n=-33554432) at foo.c:6 
#174686 0x0000000000400522 in integerReplacement (n=-67108864) at foo.c:6 
#174687 0x0000000000400522 in integerReplacement (n=-134217728) at foo.c:6 
#174688 0x0000000000400522 in integerReplacement (n=-268435456) at foo.c:6 
#174689 0x0000000000400522 in integerReplacement (n=-536870912) at foo.c:6 
#174690 0x0000000000400522 in integerReplacement (n=-1073741824) at foo.c:6 
#174691 0x0000000000400522 in integerReplacement (n=-2147483648) at foo.c:6 
#174692 0x0000000000400547 in integerReplacement (n=2147483647) at foo.c:11 
#174693 0x0000000000400567 in main() at foo.c:18 

所以你其实做堆栈溢出(通常是您的算法应该不会再发生超过31次,但由于签订溢出结束结束在用完堆栈之前重复执行174693次)。

+0

thnx这个答案...但有一个疑问是:海湾合作委员会只有31栈整数? –

+0

@RaviSingh在大多数当前体系结构中,整数有31位(加上符号位)。这限制了在达到0或1之前可以将它除以2的次数。 –