我正在尝试编写一个将数组初始化为零的函数:
void InitializingToZero(int numOfrows, int numOfcols, int array[][20]) {
for (int i = 0; i < numOfrows; i++) {
for (int j = 0; j < numOfcols; j++) {
array[i][j] = 0;
}
}
}
int main() {
int num_of_rows = 3;
int num_of_cols = 3;
int array[num_of_rows][num_of_cols];
InitializingToZero(num_of_rows, num_of_cols, array);
for (int i = 0; i < num_of_rows; i++) {
for (int j = 0; j < num_of_cols; j++) {
printf("%d ", array[i][j]);
}
printf("\n");
}
}
我得到了这个输出:
0 0 0
0 0 0
268501009 0 4200656
答案 0 :(得分:3)
错误是
int num_of_rows = 3;
int num_of_cols = 3;
然后使用列字段20
传递数组。因此,阵列未正确初始化。这就是问题所在。
你应该这样做
void InitializingToZero(int numOfrows, int numOfcols, int array[][numOfcols]) {
如果只知道数组的最大大小可以是20x20,而numOfrows,numOfcols是来自用户的输入,我该怎么办呢?
然后你这样做
#define MAXSIZE 20
int array[MAXSIZE ][MAXSIZE];
..
InitializingToZero(num_of_rows, num_of_cols, array);
功能将是
void InitializingToZero(int numOfrows, int numOfcols, int array[][MAXSIZE]) {
答案 1 :(得分:0)
我知道Quentin的回答是正确的,但为什么将内存区域设置为0会如此复杂?
int main( void ) {
const int COLS_AMOUNT = 3;
static const int ROWS_AMOUNT = 3;
int num_of_rows = ROWS_AMOUNT;
int num_of_cols = ROWS_AMOUNT;
int array[ROWS_AMOUNT][COLS_AMOUNT];
/* Set to 0 */
(void)memset( (void*)array, (int)0, sizeof( array ) );
/* Then check previous set in decreasing order... */
while( num_of_rows-- ) {
while( num_of_cols-- ) {
printf( "array[%d][%d]:%d ",
num_of_rows,
num_of_cols,
array[num_of_rows][num_of_cols] );
}
printf("\n");
}
}
答案 2 :(得分:0)
将您的数组声明为
int num_of_rows = 3;
int num_of_cols = 3;
int array[num_of_rows][num_of_cols];
您正在创建大小为[3][3]
的可变长度数组(VLA)。但是函数参数被声明为数组[][20]
。
对于正确的数组参数传递,第一个大小无关紧要(因此为空[]
),但第二个(以及更多,如果有的话)大小必须与完全匹配。通过在[3]
和[20]
之间创建不匹配,您实际上对您的功能撒谎。行为未定义。在VLA的情况下,编译器无法检测和报告这种不匹配,因为它们的实际大小通常在编译时是未知的。
代码中的问题很容易解决:只需将函数参数声明为正确大小的VLA
void InitializingToZero(int numOfrows, int numOfcols,
int array[numOfrows][numOfcols])
并保持其他一切不变。 (第一个尺寸[numOfrows]
可以保留&#34;空&#34;为[]
,但我决定将其拼写为更清晰。)