所以,我在这个网站上看到c ++不允许变长数组但gcc允许它.所以,我想测试一个小代码
#include<stdio.h>
#include<stdint.h>
void main()
{
int8_t n;
int8_t var_array[n];
int8_t i;
printf("Enter array size: \r\n");
scanf("%d", &n);
for(i=0; i<n; i++)
var_array[i] = i;
for(i=0; i<n; i++)
printf("var_array[%d] = %d\r\n", i, var_array[i]);
}
Run Code Online (Sandbox Code Playgroud)
代码在linux OS中用"gcc var_array.c -o var_array"命令编译但是当我运行它时,我得到分段错误错误
Enter array size:
5
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
也可以int使用%d说明符.(因为早期只有8位,如果值很大,可能会溢出)
int n;
int i;
printf("Enter array size: \r\n");
if( scanf("%d", &n) != 1 ){
fprintf(stderr,"%s\n","Error in input");
exit(1);
}
int var_array[n];
for(i=0; i<n; i++)
var_array[i] = i;
...
Run Code Online (Sandbox Code Playgroud)
您正在使用未初始化的变量.然后基于n访问阵列的新值eof .索引最有可能从数组的边界索引出来,给出了seg错误.
用于输入int8_t用途scanf("%" SCNd8, &n);.您也可以输入int8_t类型.
scanf必须检查是的返回值.
所以理想的电话会是
if( scanf("%d",&n) == 1 ){
//...success..do work
}
Run Code Online (Sandbox Code Playgroud)