gpt4 book ai didi

c - 函数调用时数组地址错误

转载 作者:行者123 更新时间:2023-11-30 15:12:27 25 4
gpt4 key购买 nike

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() 中,passs 数组 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() 都是相同的(值发生了变化)。请帮助我理解我做错了什么。

最佳答案

让我们采用test_2()

其中 value = 10,因此 i 将从 1 变为 10

dp[i - denom[j]]

其中,当i = 10j = 0时,上面将变为dp[8],但是的大小>dp[]5,有效索引为 0 到 4

关于c - 函数调用时数组地址错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35065642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com