2017-01-29 10 views
0

コンパイル時にエラーが発生することはありません。プログラムを実行するとクラッシュします。私はgenerate関数から行列を直接印刷しようとしました。そして、それは最初の行と2番目の行を表示しました。誰かが私のプログラムがクラッシュする理由を説明できますか?

これは私のコードである

void generate(int **a)//*Function to generate a matrix a[i][j]=i+j* 
{ 
    int i,j; 
    for(i=0;i<5;i++){ 
     for(j=0;j<4;j++){ 
      a[i][j]=i+j; 
     } 
    } 
} 

void print(int **a)//*print the resulting matrix from generate function* 
{ 
    int i,j; 
    for(i=0;i<5;i++){ 
     for(j=0;j<4;j++){ 
      printf("%d ",a[i][j]); 
     } 
     printf("\n"); 
    } 
} 

int main() 
{ 
    int *a=(int*)malloc(5*4*sizeof(int));//*allocating memory for a matrix of 4 lines and 5 columns.* 
    generate(&a); 
    print(&a); 
} 
+1

です。あなたが望むから2スターのポインタを受け取ることはありません。コンパイラの警告を確認してください。 –

+1

ポインタ( '&a')へのポインタは二次元配列と同じではありません。 – DyZ

答えて

1

:少なくとも潜在的変数、配列のサイズを維持しながら

はこれを克服するために、あなたは次のことを行うことができます(「4」と「5」は、まだハード機能でコード化されていることに注意してください) 1)1次元メモリを割り当てています。以下は

a[i][j]=i+j; //is not valid. 

あなたの機能があるものを、行と列見当がつかない変更したコード

#include <stdio.h> 
#include <stdlib.h> 

void generate(int *a)//*Function to generate a matrix a[i][j]=i+j* 
{ 
    int i,j; 
    for(i=0;i<5;i++){ 
     for(j=0;j<4;j++){ 
      *a=i+j; 
       a++; //increments to next memory location 
     } 
    } 
} 

void print(int *a)//*print the resulting matrix from generate function* 
{ 
    int i,j; 
    for(i=0;i<5;i++){ 
     for(j=0;j<4;j++){ 
      printf("%d ",*(a++)); //notice another way of accessing 
     } 
     printf("\n"); 
    } 
} 

int main() 
{ 
    int *a=(int*)malloc(5*4*sizeof(int));//*allocating memory for a matrix of 4 lines and 5 columns.* 
    generate(a); 
    print(a); //passing the pointer 
    free(a); //Always always practice to free the allocated memory, don't ever do this mistake again 
    return 0; 
} 
+0

ありがとうございました – Mamaliga

+0

@Mamaliga Welcome :) –

0

2つのこと:

まず、int ** int型ではなくintの配列を指すポインタを指すポインタへのポインタを表します。

第2に、ポインタをいくつかのデータ構造体に渡すだけです。整数の4×5配列の場合、コンパイラはこのデータ構造のレイアウトを導出できません。私。 a[i][j]のようなステートメントは、コンパイラが各行iが4つの列jで構成されていることを "知っている"ことを要求し、値を格納する場所、つまりa + (4*i) + jを計算できるようにします。コンパイラは、列当たりの列の数がわかりません(つまり、4)。

void generate(int *a)//*Function to generate a matrix a[i][j]=i+j* 
{ 
    int i,j; 
    for(i=0;i<5;i++){ 
     for(j=0;j<4;j++){ 
      *(a+(i*4+j)) = i+j; 
     } 
    } 
} 

void print(int *a)//*print the resulting matrix from generate function* 
{ 
    int i,j; 
    for(i=0;i<5;i++){ 
     for(j=0;j<4;j++){ 
      printf("%d ", *(a+(i*4+j))); 
     } 
     printf("\n"); 
    } 
} 

int main() 
{ 
    int *a=(int*)malloc(5*4*sizeof(int));//*allocating memory for a matrix of 4 lines and 5 columns.* 
    generate(a); 
    print(a); 
} 
+0

ありがとうございました。私の心にドットをつないでいただきありがとうございます。 – Mamaliga

関連する問題