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()是相同的(值已更改)。请帮助我理解我做错了什么。
答案 0 :(得分:1)
让我们来test_2()
在value = 10
中,i
将来自1 to 10
dp[i - denom[j]]
在此,i = 10
和j = 0
时,上述内容将变为dp[8]
,但dp[]
的大小为5
且有效索引为{{ 1}}。