首页 > 解决方案 > 当我的数组大于 4 个元素时出现分段错误

问题描述

#include <stdio.h>

int main() 
{
    int k, i, j, n, smallest;
    int numbers[k];
    printf("Introduceti k: ");
    scanf("%d", &k);
    for (i = 0; i < k; i = i + 1)
    {
        printf("Introduceti %d numar: ", i+1);
        scanf("%d", &n);
        numbers[i] = n;
    }
    printf("%d", numbers[k-1]);
    return 0;
}

当我将k值设置为小于 5 时,程序执行良好,但是当我将其设置为 >=5 时,它会给出错误:

zsh: segmentation fault ./main.out

PS 我正在使用 MacOS BigSur 11.6

标签: c

解决方案


使用int numbers[k];,您在堆栈中为k整数留出空间。但是,在您的程序中,k此时未初始化,您正在为任何恰好kint. 从技术上讲,这是UB,您的程序可能会做任何事情(包括什么都不做、崩溃和完美运行)。

您应该scanf("%d", &k);在声明numbers数组之前执行此操作。

编辑 - 由于您需要将声明保留在顶部,您可以使用malloc()

int main() 
{
    int k, i, j, n, smallest;
    int *numbers;
    printf("Introduceti k: ");
    scanf("%d", &k);
    numbers = malloc(k * sizeof (int));

malloc()将为k堆上的整数分配空间。free(numbers)完成numbers变量后不要忘记调用。


推荐阅读