c - 当我的数组大于 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
解决方案
使用int numbers[k];
,您在堆栈中为k
整数留出空间。但是,在您的程序中,k
此时未初始化,您正在为任何恰好k
是int
. 从技术上讲,这是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
变量后不要忘记调用。
推荐阅读
- html - 与 vue.js 连接的 Fivem Lua 脚本
- firebase-hosting - Firebase 托管:远程 Web 服务器托管可能是可公开访问的 .bash_history 文件
- c++ - 为什么我的 cout 语句给了我一个错误?
- authentication - 按日登录跟踪 SQL Server CPU 和内存使用情况
- mongodb - 组合组累加器运算符
- c# - C# 让 MongoDB BsonDocument 返回为 JSON
- bash - 带替换的参数扩展,避免额外的变量
- javascript - ASP.NET Core 5.0 MVC HLS Transcoding using FFMPEG
- c - 试图用 strtol 将 str 更改为 int,但它给出了不同的值
- html - Bootstrap 5、me 和 ms 类