c-指向整数的不兼容指针是什么意思



我想要一个创建包含int num乘积值的数组的函数,以及另一个打印数组的函数。然而,我看不出这些错误。

我的代码:

.c文件

#include "multiplication.h"
#include <stdio.h> 
int main(){
int arr=multiplication(4);
printArray(4,arr);

}
int multiplication(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 num,int arr[num][num]){

int i;
for(i=0;i<num;i++){
for(int j=0;j<num;j++){
printf("%d ",arr[i][j]);
}

}
}

.h文件:

int multiplication(int num);
void printArray(int num,int arr[num][num]);

错误:

multiplication.c:6:14: warning: incompatible integer to pointer conversion passing 'int' to parameter of type 'int (*)[*]' [-Wint-conversion]
printArray(4,arr);
^~~
./multiplication.h:4:29: note: passing argument to parameter 'arr' here
void printArray(int num,int arr[num][num]);
^
multiplication.c:22:12: warning: incompatible pointer to integer conversion returning 'int [num][num]' from a function with result type 'int' [-Wint-conversion]
return arr;
^~~
multiplication.c:22:12: warning: address of stack memory associated with local variable 'arr' returned [-Wreturn-stack-address]
return arr;
^~~
^
multiplication.c:25:33: note: declared here
void printArray(int num,int arr[num][num]){
^

您的代码是一个很大的未定义行为。

int mulitpication(int num)

  1. 您想要返回一个指向int的指针。但是它被声明为int而不是int *。当您试图返回指针时,编译器会警告您不兼容的转换
  2. 即使您将其声明为返回指针,您也会返回一个指向自动变量的指针,当函数返回时,该变量将不存在(关于堆栈变量的警告(

void printArray(int num,int arr[num][num])

  1. sizeof返回指针的大小,而不是数组的大小

main函数

  1. arr是单个整数,您尝试将其传递给print函数。你需要把它做成int *

这就是我认为您需要的代码:

#include <stdio.h>
static void multiplication(int num, int arr[num][num]);
static void printArray(int num, int arr[num][num]);
int main(void)
{
int arr[4][4];
multiplication(4, arr);
printArray(4, arr);
return 0;
}
static void multiplication(int num, 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);
printf("arr[%d][%d] = %dn", i, j, arr[i][j]);
}
}
}
static void printArray(int num, int arr[num][num])
{
int i;
for (i = 0; i < num; i++)
{
for (int j = 0; j < num; j++)
{
printf("%d ", arr[i][j]);
}
putchar('n');
}
}

运行的输出是:

arr[0][0] = 1
arr[0][1] = 2
arr[0][2] = 3
arr[0][3] = 4
arr[1][0] = 2
arr[1][1] = 4
arr[1][2] = 6
arr[1][3] = 8
arr[2][0] = 3
arr[2][1] = 6
arr[2][2] = 9
arr[2][3] = 12
arr[3][0] = 4
arr[3][1] = 8
arr[3][2] = 12
arr[3][3] = 16
1 2 3 4 
2 4 6 8 
3 6 9 12 
4 8 12 16 

您可以在main()中进行更改,例如,从用户那里获取一个大小,创建一个该大小的数组,并将信息传递给函数:

int size;
if (scanf("%d", &size) == 1 && size > 0 && size < 100)
{
int other[size][size];
multiplication(size, other);
printArray(size, other);
}

最新更新