【问题标题】:Why is the following code giving Segmentation fault in codechef, but is working absolutely right elsewhere为什么以下代码在 codechef 中给出分段错误,但在其他地方工作绝对正确
【发布时间】:2014-11-13 15:07:37
【问题描述】:

以下代码在代码块和几个在线编译器中运行良好,但在提交时会出现分段错误。

据我所知,每当我们尝试访问一些未分配的内存时,都会发生段错误,但这是如何以及在哪里发生的?

#include<stdio.h>
int minimum(int a[][300],int n)
{
    int flag=0,minval=100000000,mini,i,j,temp;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(a[j][i]!=0&&flag==0)
            {
                temp=a[j][i];
                flag=1;
            }
            else if(a[j][i]!=0&&temp!=a[j][i])
            {
                flag=0;
                break;
            }
        }
        if(flag==1&&temp<minval)
        {
            minval=temp;
            mini=i;
            flag=0;
        }
    } 
    return mini;
}

int main()
{
    int i,j,t,n,a[300][300],copy[300],column,subt;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
            {
                if(j!=i)
                    scanf("%d",&a[i][j]);
                else
                    a[i][j]=0;
            }
        column=minimum(a,n);
        for(i=0;i<n;i++)
            if(a[i][column]==0)
                break;
        for(j=0;j<n;j++)
            copy[j]=a[i][j];
        subt=a[(i+1)%n][column];
        for(i=0;i<n;i++)
        {
            if(copy[i]==0)
                copy[i]+=subt;
            else
                copy[i]+=1;
        }
        for(i=0;i<n;i++)
            printf("%d ",copy[i]);
        printf("\n");
    }
    return 0;
}

我还尝试在 python 中提交完全相同的代码(完全相同的逻辑)。这同样在所有地方都运行得很好,但只要提交就会给 NZEC。

def minimum(a,n):
    flag=0
    minval=max(max(a))+1
    for i in range(n):
        for j in range(n):
            if a[j][i]!=0 and flag==0:
                temp=a[j][i]
                flag=1
            elif a[j][i]!=0 and temp!=a[j][i]:
                flag=0
                break
        if flag==1 and temp<minval:
            minval=temp
            mini=i
            flag=0
    return mini

for i in range(input()):
    n=input()
    a=[]
    copy=[]
    for j in range(n):
        temp=(map(int,raw_input().split()))
        temp.insert(j,0)
        copy=temp[:]
        a.append(copy)
        del temp

    column=minimum(a,n)
    print column
    for k in range(n):
        if a[k][column]==0:
            break
    copy=a[k][:]    
    subt=a[(k+1)%n][column]
    for k in range(n):
        if copy[k]==0:
            copy[k]=copy[k]+subt
        else:
            copy[k]=copy[k]+1

    del a
    for item in copy:
        print item,
    print

同一代码如何在两种编程语言中生成两种类型的运行时错误

【问题讨论】:

    标签: python c python-2.7 segmentation-fault


    【解决方案1】:

    如果在您扫描数组期间从未设置过mini,您的函数minimum 可能会返回一个未初始化的值。我不确定你的逻辑应该是什么,但也许你应该在函数顶部初始化 mini = 0 或做其他事情来防止这种情况发生。您没有指定给定矩阵中应该包含的内容,但作为示例,全零矩阵会触发此行为。

    【讨论】:

      猜你喜欢
      • 2019-08-29
      • 2021-03-04
      • 2012-12-01
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      相关资源
      最近更新 更多