每当我在C中动态初始化数组时,我总是会收到SIGSEGV错误。请告诉我,我一直在做错什么?
该代码在TurboC上运行正常但它给出了使用GCC的在线判断的SIGSEGV。
我的代码:
#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;
}
答案 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
表示阵列中有多少元素,尽管可能有更多容量。
而且,顺便说一下,你应该始终认为失败的呼叫(例如scanf
和malloc
)将失败一点。换句话说,检查返回值。