gpt4 book ai didi

c - C 错误中的 SIGSEGV

转载 作者:行者123 更新时间:2023-11-30 20:20:30 26 4
gpt4 key购买 nike

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;

}

最佳答案

首先,在该代码中没有任何地方真正为comm分配内存来指向。您显然知道这是必需的,因为您已经对 a 做了类似的操作,并且释放了 a comm在最后。

在使用之前,您需要malloccomm指向的内存。例如,如果您希望它取决于第二个值输入(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 指示数组中有多少元素,尽管事实上可能还有更多容量。

<小时/>

而且,顺便说一句,您应该始终假设可能会失败的调用(例如 scanfmalloc) 在某个时刻失败。换句话说,检查返回值。

关于c - C 错误中的 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46137636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com