函数调用中的数组地址出错

时间:2016-01-28 15:34:13

标签: c

int coin_change(int value, int denom[], int n) {                                
  int dp[n + 1], i, j;                                        

  dp[0] = 1;                                                                 
  for (i = 1; i <= value; i++) {                                                
    dp[i] = 0;                                                                
    for (j = 0; j < n; j++) {                                                   
      if (denom[j] <= i) {                                                      
        dp[i] = dp[i] + dp[i - denom[j]];                                    
      }                                                                         
    }                                                                           
  }                                                                             

  printf("%d\n", dp[n]);                                                     
}                                                                               

void test_1() {                                                                 
  int denom[3] = {1, 2, 3};                                                   
  coin_change(4, denom, 3);                                                  
}                                                                               

void test_2() {                                                                 
  int denom[4] = {2, 5, 3, 6};                                                
  coin_change(10, denom, 4);                                                 
}                                                                               

int main() {                                                                    
  test_1();                                                                   
  test_2();                                                                     

  return 0;                                                   
}        

这是我写的硬币更改问题的代码示例。现在第一个测试用例运行正常,但是在test_2()中,传递数组denom[]的地址是0x7fff00000000,这会导致段错误,我无法访问gdb中的内存内容地址。

这是gdb输出

Program received signal SIGSEGV, Segmentation fault.
0x00000000004005f1 in coin_change (value=10, denom=0x7fff00000000, n=4) at coinchng.c:10
10        if (denom[j] <= i) {
(gdb) p denom
$1 = (int *) 0x7fff00000000
(gdb) p denom[0]
Cannot access memory at address 0x7fff00000000

我无法理解,test_2()究竟发生了什么,因为test_1()都是test_2()是相同的(值已更改)。请帮助我理解我做错了什么。

1 个答案:

答案 0 :(得分:1)

让我们来test_2()

value = 10中,i将来自1 to 10

dp[i - denom[j]]

在此,i = 10j = 0时,上述内容将变为dp[8],但dp[]的大小为5且有效索引为{{ 1}}。