2010-06-21 79 views

回答

71

我假设你正在使用C99编译器(支持动态大小的数组)。你的代码中的问题是,当编译器看到你的变量声明时,它不知道数组中有多少元素(我在这里也假定,从编译器错误length不是编译时间常量)。

您必须手动初始化数组:

int boardAux[length][length]; 
memset(boardAux, 0, length*length*sizeof(int)); 
+0

我也可以用于这个目的malloc,那么第二个问题呢,我在Pavel的回复后写了它 – helloWorld 2010-06-21 08:10:28

+0

@helloWorld:使用堆栈分配数组,'printf(“%d”,boardAux [1] [2])'编译精细。编译器知道尺寸并知道内存中第(1,2)个元素的位置。如果使用动态分配,数组是单维的,并且您必须自己执行数学运算:'printf(“%d”,boardAux [1 * length + 2])' – 2010-06-21 08:39:12

+0

@AndreyT:感谢将错误指向'memset '喊出来。我刚刚纠正了它。 – 2010-06-21 08:39:45

-5

你不能这样做。 C编译器不能在堆栈上做这么复杂的事情。

您必须使用堆和动态分配。

你真的需要做什么:

  • 计算大小(N的sizeof(元素))内存的需要
  • 调用malloc(大小)来分配内存
  • 创建访问者:int * access(ptr,x,y,rowSize){return ptr + y * rowSize + x; }

使用* access(boardAux,x,y,size)= 42与矩阵进行交互。

+0

还有一个问题,为什么我会收到一个错误无效使用数组与未指定的界限?012fprintf(“%d”,board [i] [j]); – helloWorld 2010-06-21 08:00:51

+7

-1 C99允许在堆栈中作为用户代码进行动态分配(不包括初始化)。没有必要执行动态分配。 – 2010-06-21 08:02:15

+0

@helloWorld因为数组维必须被知道。 – 2010-06-21 08:55:39

17

您收到此错误,因为在C语言中你不能使用带有变长数组初始化。你得到的错误信息基本上说明了一切。

6.7.8 Initialization

...

3 The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.

+0

你在哪里找到这个,你能给我一个链接吗? – helloWorld 2010-06-21 08:11:42

+1

@helloWorld:这是来自语言标准(C99)。你可以在这里获得TC3更新的“工作”副本http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf – AnT 2010-06-21 08:13:10

+3

有些主题,如果你有一些人总是不相信你只提供非正式的解释。可变长度数组是其中的一个主题。 +1用于引用标准。 – 2010-06-21 08:30:25

6

这给了错误:

int len; 
scanf("%d",&len); 
char str[len]=""; 

这也给了错误:

int len=5; 
char str[len]=""; 

但是这工作得很好:

int len=5; 
char str[len]; //so the problem lies with assignment not declaration 

你需要把值以下方式:

str[0]='a'; 
str[1]='b'; //like that; and not like str="ab"; 
0

简单地声明长度是一个缺点,如果它不是,那么你应该分配内存动态

+2

我想你需要查看const的意思! – Holger 2016-09-29 17:21:28

1

声明阵列

int boardAux[length][length]; 

分配初始值为零的最简单的方法后正在使用for循环,即使它可能有点冗长

int i, j; 
for (i = 0; i<length; i++) 
{ 
    for (j = 0; j<length; j++) 
     boardAux[i][j] = 0; 
} 
1

对于C++单独声明和初始化像t他的..

int a[n][m] ; 
a[n][m]= {0}; 
相关问题