C程序 - 动态规划算法中奇怪的Seg故障

时间:2011-12-08 12:35:59

标签: c arrays segmentation-fault

我正在用C编写一个程序来做一个简单的动态编程算法,在这个算法中你可以返回加到一定数量所需的最小硬币数。这是我的代码:

#include <limits.h>
#include <stdlib.h>
#include <stdio.h>

/*
This function returns the minimum number of stamps required for a given value.
It assumes that the given array contains the available stamp sizes, and that it
always contains 1, so a solution is always possible
*/
int min_number_of_stamps(const int* array, size_t array_size, int request) {

    /* Construct a table with dimensions (array_size+1)*(request+1) */ 
    int numRows = array_size + 1;
    int numCols = request + 1;
    int **DPtable; 
    DPtable = malloc(numRows*sizeof(int));
    int i;
    for (i = 0; i < numRows; i++) {
        DPtable[i] = malloc(numCols*sizeof(int));
    }
    printf("%d",DPtable[4][0]);
    int r, c, useIt, loseIt;
    for (r = 0; r < numRows; r++) {
        for (c = 0; c < numCols; c++) {
            printf("%d,%d\n", r, c);
            if (c==0) {
                printf("1\n");
                //if the amount of change is 0, 0 coins are needed 
                DPtable[r][c] = 0;
            } 
            else if ((r==0) || c < array[r-1]) {
                printf("2\n");
                //if there are no coins or if the change needed is less than 
                //the smallest coin available, then 'infinity' coins are needed
                DPtable[r][c] = INT_MAX;
            } 
            else { 
                printf("3\n");
                useIt = DPtable[r][c-array[r-1]] + 1;
                loseIt = DPtable[r-1][c];
                if (useIt <= loseIt) { 
                    //if 'use it' requires fewer coins than 'lose it,' then 
                    //'use it' coins are needed. 
                    DPtable[r][c] = useIt;
                } 
                else { 
                    //if 'lose it' requires fewer coins, 'lose it' coins are needed 
                    DPtable[r][c] = loseIt; 
                }
            }
        }
    }

    return DPtable[numRows][numCols];

}

int main() {
    const int array[] = {1,5,10,25};
    const int* stamps = &array[0];
    printf("%d", min_number_of_stamps(stamps, 4, 44));
}

当我的内部for循环到达r = 4和c = 0的情况时,我得到一个段错误。我把我的调试打印语句留下了,因为我很懒,但你可以看到我被卡住的地方。如果我在for循环之外访问数组中的相同位置,则没有问题。但是在for循环中,我输出“分段错误:11”消息后,它输出“4,0”表示数组元素,“1”表示if情况。可以有人看到我缺少的吗?

3 个答案:

答案 0 :(得分:3)

学习启用警告&amp;调试编译器,即Linux上的gcc -g -Wall

学习使用调试器,即Linux上的gdb -tui

考虑使用valgrind

修改 网上很容易找到GCC,GDB和ValGrind的许多教程(用几种语言,例如英语,法语......)。

答案 1 :(得分:1)

return DPtable[numRows][numCols]; 多数民众赞成不是吗?

答案 2 :(得分:1)

您错误地分配了dpTable。它应该是

DPtable = malloc(numRows*sizeof(int*));

看看是否能解决问题。