2017-02-12 120 views
1

预期的结果是打印与我们输入的值相同的值,但输出在第一行之后为零。将数组传递给函数会改变它的值吗?

#include<stdio.h> 
void display(int *q, int); 

int main() { 
    int i,j,n; 
    int d[50][50]; 
    printf("Input the order\t"); 
    scanf("%d", &n); 

    for (i=0;i<=(n-1);i++) { 
     for (j=0;j<=(n-1);j++) { 
      scanf("%d", &d[i][j]); 
     } 
    } 
    display (d, n); 
} 

void display (int *q, int r) { 
    int i,j; 

    for (i=0;i<r;i++) { 
     for (j=0;j<r;j++) { 
      printf("%d\t", *(q + i*r + j)); 
     } 
     printf("\n"); 
    } 
} 
+2

编译器在将它传递给'display'后不知道'd'的尺寸。 – goodvibration

+0

搜索如何将多维数组传递给C中的函数。例如,请参阅[本文](http://stackoverflow.com/q/16943909/478288)。 – chrisaycock

回答

0

您的函数声明的参数类型为int * 。您正在尝试传递类型为int [50][50]的参数,该参数衰减为指针类型int (*)[50]。这些指针类型不兼容。语言不支持从int (*)[50]int的隐式转换。你的代码不是一个有效的C程序,我相信你的编译器会告诉你。

一个更有意义的事就是声明你的功能

void display (int n, int q[n][n]) 

q[i][j] 

访问数组元素以自然的方式。然而,对于你将不得不使用真正的数组大小为n(即50你的情况)。如果您想要处理更小的元素子矩阵,则必须单独传递其大小。

但是,如果你真的想用你的“黑客”,你将不得不调用你的函数

display ((int *) d, n); 

时使用显式类型转换并牢记您的原始阵列的每行仍然包含50种元素,正如声明的那样,不管n的值如何。这意味着在你的函数中,你将不得不使用50作为行大小乘数

void display (int *q, int r) { 
    int i,j; 

    for (i=0;i<r;i++) { 
     for (j=0;j<r;j++) { 
      printf("%d\t", *(q + i*50 + j)); 
     } 
     printf("\n"); 
    } 
} 
+0

我真的不知道是谁降低了这个... –

0

display日常假定二维数组是[n][n],而它是[50][50]

您必须将实际的2D阵列尺寸与n并排,display例程无法知道实际的2D阵列尺寸。

你可以动态地声明您的数组是这样的:

printf("Input the order\t"); 
    scanf("%d", &n); 
    int d[n][n]; 

,然后避免该警告

test.c:20:18: warning: passing argument 1 of 'display' from incompatible pointer type 
     display (d, n); 

这里被明确铸造1D指针(因为你知道的结构):

display ((int*)d, n); 
+0

这项工作是谁做的? #include void display(int * q,int); int main() { int a [3] [3] = {1,2,3,4,5,6,7,8,9}; display(a,3); } 空隙显示器(INT * Q,INT R) { INT I,J; (i = 0; i

+0

@NibirPawanDas - 所以不是一个论坛,所以请摆脱这种心态的自己。特别是,帖子并不是为了便于讨论。不要在评论中发布整个程序,并期望讨论它。 – StoryTeller

+0

它的工作原理是因为您的尺寸匹配!在当前程序中输入50也可以。检查我的编辑。 –