我想创建一个数组来存储任何整数 n 的乘法值。之后,我想将该数组传递给另一个函数并打印出该数组。但是,我收到以下错误:
My code:
这是我的 .c 文件:
#include "multiplication.h"
#include <stdio.h>
int main(){
int num;
int arr=multiplication(4);
printArray(arr);
}
int mulitpication(int num){
/* initialize array and build*/
int arr[num][num];
for(int i=0; i<num;i++){
printf("row number: %d ",i);
for(int j=0;j<num;j++){
printf("column number: %d", j);
arr[i][j]= (i+1)*(j+1);
}
}
return arr;
}
void printArray(int arr[][]){
int i;
for(i=0;i<sizeof(arr);i++){
for(int j=0;j<sizeof(arr);j++){
printf("%d ",arr[i][j]);
}
}
这是我的头文件:
void multiplication(int num);
void print(int arr[][]);
错误:
multiplication.h:4:19: error: array has incomplete element type 'int []'
void print(int arr[][]);
^
首先,您不会将源文件相互包含在一起,而是将它们编译并链接在一起以形成二进制文件。
也就是说,实际问题出在您没有显示的代码中(multiplication.h
文件),但是从错误消息中我们可以看到
void print(int arr[][]);
不是有效的语法。您只能将外部(最)索引保留为空,所有其他索引必须具有正确的值。就像是
void print(int arr[ ][10]);
^^---------- inner index
^^^------------- outer index
或者,对于更多维度
void print(int arr[ ][5][10][15]);
这背后的类比是,对于函数声明符来说,
“将参数声明为“类型数组”应调整为“指向类型的限定指针”,......”
因此,要进行这种调整,type编译器应该在编译时知道。
如果有类似的声明
void print(int arr[][10]);
类型是int[10]
,但是如果像这样的语法
void print(int arr[][]);
是允许的,但类型未知。因此出现了错误。
其他问题:您似乎还有很多其他问题,例如
函数定义是
int mulitpication(int num){ // returning an int
但实际上你这样做
return arr; //where arr is an array of size int[num][num], defined locally
这是无效的,因为有两件事
- an
int
and an int[num][num]
不是同一类型。
- VLA 的范围,即
arr
仅限于功能块,您不能让数组将地址返回给调用者并期望有意义的内容,因为返回的地址将不再有效。
我相信,你最好使用分配的内存(malloc()
和家庭)并手动跟踪元素的索引/计数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)