C编程中未知界限的数组



i在多次运行时,代码的输出不确定。我想知道为什么输出不确定,以及当我尝试将值分配给未知数的数组时,将有什么含义。

#include <stdio.h>
int main()
{
  int a[]= {};
  int num_of_elements;
  int count = 0;
  printf("Enter the number of elements:n");
  scanf("%d",&num_of_elements);
  printf("Enter the numbers:n");
  for(count=0; count<num_of_elements; ++count)
  {
    scanf("%d", &a[count]);
  }
  printf("n");
  for(count=0; count<num_of_elements; count++)
  {
    printf("%d,   ", a[count]);
  }
  printf("n");
  return 0;
}

在不同时间运行时输出:

Enter the number of elements:
2
Enter the numbers:
1 2
0,   0,

Enter the number of elements:
3
Enter the numbers:
1 2 3
0,   0,   2,

Enter the number of elements:
4
Enter the numbers:
1 2 3 4
0,   0,   2,   3,
Segmentation fault

Enter the number of elements:
5
Enter the numbers:
1 2 3 4 5
0,   0,   2,   3,   4,
Segmentation fault

作为第一个提示,当您尝试使用gcc使用-pedantic编译此提示时,它将拒绝编译:

$ gcc -std=c11 -Wall -Wextra -pedantic -ocrap.exe crap.c
crap.c: In function 'main':
crap.c:5:12: warning: ISO C forbids empty initializer braces [-Wpedantic]
   int a[]= {};
            ^
crap.c:5:7: error: zero or negative size array 'a'
   int a[]= {};
       ^

确实,这样一个变量的大小是 0,所以您不能存储

仍然是有效的语法,具有其用途,例如结构的"灵活数组成员":

struct foo
{
    int bar;
    int baz[];
};
[...]
struct foo *myfoo = malloc(sizeof(struct foo) + 5 * sizeof(int));
// myfoo->baz can now hold 5 integers

我想知道为什么输出不确定,以及当我尝试将值分配给未知数组的数组

时将有什么含义

可变 a的大小为 0,因为num_of_elements在此时尚未被 scanf'ed,因此您无法在其中存储任何内容。

解决方案是在 之后声明数组您已从用户读取其大小。这意味着:

#include <stdio.h>
int main()
{
    int num_of_elements;
    int count = 0;
    printf("Enter the number of elements:n");
    scanf("%d", &num_of_elements);
    //define here your array
    int a[num_of_elements];
    ...
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新