2017-09-06 2 views
0

Ich studiere die C-Sprache und Datenstrukturen. Ich möchte einige detaillierte Erklärungen darüber erhalten, warum wir dynamische Arrays nicht als Parameter von Funktionen verwenden können, die statische Array-Parameter verwenden. Warum können wir dynamische Arrays nicht als Parameter von Funktionen verwenden, die statische Array-Parameter verwenden?

#include <stdio.h> 

int sumAry2D_f1(int ary[][3], int rows, int cols); 
void freeAry2D(int **ary, int rows); 

int main(void) 
{ 
    int ary2D[][3] = { {1, 2, 3}, {4, 5, 6} }; // static array 

    int r, c; 
    int **ary = (int**)malloc(sizeof(int*) * 2); // dynamic array 
    for (r = 0; r < 2; r++) 
    ary[r] = (int*)malloc(sizeof(int)*3); 

    for (r = 0; r < 2; r++) 
     for (c = 0; c < 3; c++) 
      ary[r][c] = r + c; // 0, 1, 2, 1, 2, 3 

    printf("sumAry2D_f1() %d\n", sumAry2D_f1(ary2D, 2, 3)); 

    // why we can`t function like this? 
    // printf("sumAry2D_f1~3() %d\n", sumAry2D_f1(ary, 2, 3)); 

    freeAry2D(ary, 2); // free function of dynamic array 

    return 0; 
} 

int sumAry2D_f1(int ary[][3], int rows, int cols) 
{ 
    int i, j, sum = 0; 

    for (i = 0; i < rows; i++) 
     for (j = 0; j < cols; j++) 
      sum += ary[i][j]; 

    return sum; 
} 

void freeAry2D(int **ary, int rows) 
{ 
    int i; 

    for (i = 0; i < rows; i++) 
    free(ary[i]); 
    free(ary); 
} 
+1

'int ary [] [3]' stimmt nicht mit 'int **' überein. ZB "int ary [] [3]" (aka 'int (* ary) [3]') zeigt auf '[int [3]] [int [3]] ...'. 'int ** ary 'zeigt auf' [int *] [int *] ... '. – BLUEPIXY

+1

Bitte fügen Sie keinen Junk-Text hinzu, um den "mostly code" -Filter zu umgehen. – Chris

+0

Es tut mir leid, wenn Sie sich schlecht gefühlt haben. Heute stoße ich zuerst auf Stack Overflow und der Satz hat mich in Verlegenheit gebracht. – Jeong

Antwort

0
// why we can`t function like this? 
// printf("sumAry2D_f1~3() %d\n", sumAry2D_f1(ary, 2, 3)); 

Ihre Funktion erwartet speziell einen Zeiger auf einen ganzzahligen Zeiger, der auf eine Folge von ganzen Zahlen 3 Punkte oder einem Array von 3-Element-Arrays integer, nicht irgendeinen Zeiger Zeiger auf Integer. ary ist nur ein Zeiger auf Ganzzahlzeiger. Obwohl Sie Ihre int ** haben die gleiche Struktur wie Ihre int [][3], könnte es anders sein und der Compiler kann nicht sagen, da die Speicherzuordnung zur Laufzeit auftritt, daher, wenn Sie den Code kommentieren wird es wahrscheinlich nicht kompilieren, und sogar Wenn dies der Fall ist, ist das Verhalten nicht definiert.

Leider würden Sie 2 Funktionen müssen tun, was Sie wollen:

int sumAry2D_f1(int ary[][3], int rows, int cols); 

und

int sumAry2D_f12(int** ary, int rows, int cols); 

Der Code in jeder Funktion wäre das gleiche.

+0

Thx. Ihre Erklärung war sehr hilfreich, um zu verstehen, worüber ich neugierig bin !! – Jeong

+0

Nein. Vergessen Sie nicht, die Antworten zu mögen, die Sie nützlich finden, es ermutigt Menschen, zu helfen. – savram

Verwandte Themen