【问题标题】:Weird output with a variable length array?带有可变长度数组的奇怪输出?
【发布时间】:2014-04-30 05:27:07
【问题描述】:

我对此很头疼,但无法继续,所以请帮忙。 从事编程任务:

INPUT:
First line contains a value N representing the dimension of the input matrix, followed by N lines, each line representing a row of the matrix. Within each row, N values are given and are separated by whitespace.

因此,我不得不使用 scanf(),而不是使用 fgets(),然后使用 strtol() 提取数字,因为分配平台无法与 strtol() 一起正常工作。

这是我的程序:

int main()
{
   int N;
   int arr[N][N];
   int idx1, idx2=0;

   scanf("%d ",&N);

   for (idx1=0; idx1<N; idx1++) {
      for(idx2=0; idx2<N; idx2++) {
         scanf("%d", &arr[idx1][idx2]);
         printf("arr[%d][%d]=%d ", idx1, idx2, arr[idx1][idx2]);
      }
   }
   printf("\n");
   for (idx1=0; idx1<N; idx1++) {
      for(idx2=0; idx2<N; idx2++) {
         printf("arr[%d][%d]=%d ", idx1, idx2, arr[idx1][idx2]);
      }
   }

   return 0;
}

输出:

3
1 2 3
arr[0][0]=1 arr[0][1]=2 arr[0][2]=3 
4 5 6
arr[1][0]=4 arr[1][1]=5 arr[1][2]=6 
7 8 9
arr[2][0]=7 arr[2][1]=8 arr[2][2]=9 
arr[0][0]=1 arr[0][1]=4 arr[0][2]=7 arr[1][0]=4 arr[1][1]=7 arr[1][2]=8 arr[2][0]=7 arr[2][1]=8 arr[2][2]=9

FWIW gcc --version gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

为什么第二个输出与第一个不匹配?我在这里错过了什么?

【问题讨论】:

  • 为什么你的scanf中的转换说明符后面有一个空格?

标签: c gcc variable-length-array


【解决方案1】:
int N;
int arr[N][N];
int idx1, idx2=0;

scanf("%d ",&N);

您必须在编写N 对象后声明arr。这里当arr 被声明时,N 的值是不确定的。

【讨论】:

  • 谢谢,早有想过,但没有早点尝试。
【解决方案2】:

如果你想创建一个这样的可变长度数组,你需要动态分配它,而不是创建一个大小为 N 的数组(N 当时有一些垃圾值),然后根据用户输入更改它的大小.使用 malloc 或 calloc。

【讨论】:

  • 获取用户输入然后用int arr[N][N]创建数组就可以了。
  • 问题是,它正在创建一个大小为 [N][N] 的数组,其中 N 尚未初始化,据我所知,这是一种糟糕的做法
  • 是的,但是按照我的评论建议,先初始化或分配 N 然后创建数组是可以的做法
  • int N; int arr[N][N];这就是我所说的不好的做法,N 有一个垃圾值并且创建一个 2D 数组是不好的做法,即使它稍后会改变
  • 我们同意int N; int arr[N][N]; 是不好的做法。我是说,可以改为使用int N; scanf("%d", &amp;N); int arr[N][N];——如果我们还包括一些错误检查,即N 输入正确。因此,您不需要使用 malloc。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多