0

我制作了一个涉及多维数组(它打印一个多维字符数组)的 C 程序来复习一下,但我遇到了一个错误。

我对该程序的预期输出是:

.
.
.
A
.
.
.
.
.

但是我得到的输出是:

.
.
A     //Not meant to be 'A' but rather a '.'
A
.
.
.
.
.    

我想知道如何在位置 [0][2] 中获得额外的“A”,以及如何解决此问题。

这是我的代码:

#include <stdio.h>

void initArray(char shape[][2]);

main()
{
      char shape[2][2];
      int i, j;

      initArray(shape);
      shape[1][0] = 'A';
      printf("%c\n%c\n%c\n", shape[0][0], shape[0][1], shape[0][2]);  
      printf("%c\n%c\n%c\n", shape[1][0], shape[1][1], shape[1][2]);
      printf("%c\n%c\n%c\n", shape[2][0], shape[2][1], shape[2][2]);

      getchar();
}

void initArray(char shape[][2])
{
      int  i, j;

      for(i = 0; i < 3; i ++)
      {
            for(j = 0; j < 3; j++)
            {
                  shape[i][j] = '.';                  
            }
      }
}

非常感谢=D

4

2 回答 2

3

因为您需要循环直到< 2asshape声明为shape[2][2]

 for(i = 0; i < 2;i++)
   for(j = 0; j < 2; j++)

这将遍历shape行和列0-1都包括在内

于 2013-08-31T15:48:56.603 回答
1

一种可能的方法是避免使用多维数组,并使用普通数组。然后代替char shape[2][2];你声明

 char shape[4];

和代码shape[2*i+j]而不是shape[i][j]. (顺便说一句,编译器将后者转换为前者)。

使用调试器(如gdb)查看是否有意义的值ijassert(i>=0 && i<2)在适当的地方添加。

请记住,声明的数组char arr[4];(如我shape上面的)只接受从 0 到 3(即 4-1)的索引,即使用arr[0], ...arr[3]arr[i]具有 0 和 3 之间的积分i。访问arr[4]arr[17]arr[i+1]何时i为 3)是未定义的行为(根据 C 标准,任何事情都可能发生,包括符合标准的宇宙崩溃)。这种特殊错误很常见,称为缓冲区溢出。它用于恶意软件。

于 2013-08-31T15:50:10.083 回答