SIGSEGV中的C错误

时间:2017-09-10 05:41:37

标签: c algorithm gcc runtime-error sigsegv

enter image description here每当我在C中动态初始化数组时,我总是会收到SIGSEGV错误。请告诉我,我一直在做错什么?

该代码在TurboC上运行正常但它给出了使用GCC的在线判断的SIGSEGV。

Programming Problem

我的代码:

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    long n,h,i,crane=0,box=0,temp=0;
    long *comm;
    scanf("%ld %ld",&n,&h);
    long *a = (long*)malloc(n*sizeof(long));
    for(i=0;i<n;i++)
        scanf("%ld",&a[i]);
    scanf("%ld",&comm[0]);
    i=0;
    while(comm[i]!=0)
    {
       i++;
       scanf("%ld",&comm[i]);
    }
    for(i=0;comm[i]!=0;i++)
    {
        if(comm[i]==3)
            box=1;
        if(comm[i]==4 && box==1)
        {
            a[crane]=(a[crane]+1);
            temp=0;
        }
        if(box==1 && (comm[i]==1 || comm[i]==2) && temp==0)
        {
             a[crane]=(a[crane]-1);
             temp=1;
        }
        if(crane!=0 && comm[i]==1)
            crane--;
        if(comm[i]==2)
            crane++;
        if(comm[i]==0)
            break;
   }
   for(i=0;i<n;i++)
       printf("%ld ",a[i]);
   free(a);
   free(comm);
   return 0;

}

1 个答案:

答案 0 :(得分:1)

首先,该代码中的无处实际上是为comm分配内存指向的。您显然知道这是必需的,因为您已为a做了类似的事情,并且您最后释放了a comm

在使用之前,您需要malloc comm的内存指向。例如,如果您希望依赖于第二个值输入(h,可能因为它未在其他任何地方使用),您需要添加:

comm = malloc(h*sizeof(long));

在第一个scanf之后,注意到我没有投出返回值 - 你不应该在C中这样做。

如果你知道在使用它之前应该有多大comm,处理它的常用方法是分配一定数量的元素(容量)和跟踪你使用了多少(大小)。每当您的尺寸即将超过您的容量时,请使用realloc以获得更多空间。

以下(类C)伪代码显示了如何执行此操作,从空数组开始,每次需要更多空间时将其扩展30个元素:

comm = NULL
capacity = 0
size = 0
for each value in input():
    if size == capacity:
        capacity += 30
        comm = realloc (comm, capacity), exit if error
    comm[size++] = value

请注意,在循环退出时,size表示阵列中有多少元素,尽管可能有更多容量。

而且,顺便说一下,你应该始终认为失败的呼叫(例如scanfmalloc失败一点。换句话说,检查返回值。