每当我在 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;
}
最佳答案
首先,在该代码中没有任何地方真正为comm
分配内存来指向。您显然知道这是必需的,因为您已经对 a
做了类似的操作,并且释放了 a
和 comm
在最后。
在使用之前,您需要malloc
供comm
指向的内存。例如,如果您希望它取决于第二个值输入(h
,可能是因为它没有在其他地方使用),您需要添加:
comm = malloc(h*sizeof(long));
在第一个 scanf
之后,请注意我没有转换返回值 - 你不应该在 C 中这样做。
如果您不在使用comm
之前知道它应该有多大,通常的处理方法是分配一定数量的元素(容量)并记录您使用了多少(尺寸)。每次当您的大小即将超出容量时,请使用 realloc
来获取更多空间。
以下(类似 C)伪代码展示了如何执行此操作,从一个空数组开始,每次需要更多空间时将其扩展三十个元素:
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
)将 在某个时刻失败。换句话说,检查返回值。
关于c - C 错误中的 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46137636/