只有某些输入的 C 中的分段错误

Posted

技术标签:

【中文标题】只有某些输入的 C 中的分段错误【英文标题】:Segmentation fault in C with only certain inputs 【发布时间】:2013-01-04 10:13:31 【问题描述】:

好的,我正在尝试解决背包问题。

在小的输入情况下,程序运行没有问题并提供最佳解决方案,但是当输入大小很大,或者输入文件中的数字变大时,程序给我一个分段错误。我不太明白为什么会发生这种情况,因为 INT 的最大值也超过了这些数字中的任何一个。

这是我的代码。

    #include<stdio.h>
    #include<stdlib.h>
    int main(void)
    
        int W,n,i,j,k ;
        scanf("%d %d",&W,&n); // capacity of knapsack and number of total items
        int value[n+1],weight[n+1];
        int** A;
        A = (int **)malloc((n+1)*sizeof(int*));
        for(i=0;i<W+1;i++)
            A[i]=(int *)malloc(sizeof(int)*(W+1));
        for(i=1;i<n+1;i++)
        
            scanf("%d %d",&value[i],&weight[i]); //taking value and weight of each item
        
        for(i=0;i<W+1;i++)
            A[0][i]=0;
        for(i=0;i<n+1;i++)
            A[i][0]=0;
        for(i=1;i<n+1;i++)
           
            for(j=1;j<W+1;j++)
            
                if(j-weight[i]<0)
                
                    A[1][j]=A[0][j];
                
                else
                
                    if(A[0][j]>A[0][j-weight[i]]+value[i])
                        A[1][j]=A[0][j];
                    else
                        A[1][j]=A[0][j-weight[i]]+value[i];
                
            
            for(k=0;k<W+1;k++)
                A[0][k]=A[1][k];
           
        int max=0;
        i=1;
        for(i=0;i<2;i++)
            for(j=0;j<W+1;j++)
            
                if(A[i][j]>max)
                    max=A[i][j];
            
        printf("%d\n",max);
        return(0);
    

这个输入http://spark-public.s3.amazonaws.com/algo2/datasets/knapsack1.txt运行完美

但是当输入大小是链接中给定的大小时,它提供了一个段错误http://spark-public.s3.amazonaws.com/algo2/datasets/knapsack2.txt 感谢您的帮助!

【问题讨论】:

你可能想用调试符号编译你的程序并附加一个调试器。它会告诉你程序段错误的确切位置。 你是怎么做到的? int value[n+1],weight[n+1]; 这甚至不应该编译。 @sgar91 看起来像完全有效的 C99。把自己拖出八十年代! 我尝试使用 gdb 几个小时。那里没有帮助。 @sgar91 问题标记为C,官方C标准现在是C11。 C89 已死,但并未被遗忘。 :) 【参考方案1】:

在为第二维分配数组时:

for(i=0;i<W+1;i++)
     A[i]=(int *)malloc(sizeof(int)*(W+1));

在循环中应该是n+1 而不是W+1。您应该遍历“items”维度并分配“weight”维度。

该解决方案对于n &lt;= W 非常有效,但对于大量项目 (W &lt; n) - 您将获得未定义行为,因为您在某些时候尝试访问 A[n][0] ,但您没有为nth 项分配数组。

所以基本上 - 您需要将第二维的初始化更改为:

for(i=0;i<n+1;i++)
     A[i]=(int *)malloc(sizeof(int)*(W+1));

【讨论】:

以上是关于只有某些输入的 C 中的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

由于 C 中的内存不足导致的分段错误

C 中 Trie 实现中的分段错误

为啥在某些机器上堆栈溢出,但在另一台机器上出现分段错误?

C中的Minishell“分段错误,核心转储”错误

loop-malloc.c 的向量中的分段错误:没有这样的文件或目录

带有 std::promise 的 C++11 分段错误