c - C 错误中的 SIGSEGV

标签 c algorithm gcc runtime-error segmentation-fault

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/

相关文章:

c - 重新排列方程式

c - typedef struct 的标识符是什么

java - 安全删除java实现

java - 获取所有可能的组合以获得给定的没有重复数字的总和

c - Windows 上的 GCC : Set "Description" field of C executable?

c - 如何在 C 中找到 argv[] 的长度

c - C语言的时间计算器

algorithm - 找到直线上最近的矩形交点

c++ - Linux 上的 x86 C++ 开发存在哪些(有效的)备用工具链?

objective-c - 在 Linux 上编译 Objective-C 应用程序