2012-01-05 18 views
1

gcc 4.6.2 c89ダイナミック2Dキャラクタ配列の割り当て

2次元配列用のメモリの割り当てと文字の入力。

しかし、何も印刷していないときに塗りつぶしているようではありません。

ここで何か問題がありますか?

char **attributes = NULL; 

/* TODO: Check for memory being allocated */ 
attributes = malloc(3 * sizeof(char*)); 
int i = 0; 
int k = 0; 

for(i = 0; i < 3; i++) { 
    for(k = 0; k < 5; k++) { 
     sdp_attributes[i] = malloc(5 * sizeof(char)); 
     sdp_attributes[i][k] = k; 
    } 
} 

for(i = 0; i < 3; i++) { 
    for(k = 0; k < 5; k++) { 
     printf("attributes[i][k] [ %c ]\n", attributes[i][k]); 
    } 
} 

何かアドバイスのための多くのおかげで、

答えて

6

二つの主要な問題:

まず問題:

for(i = 0; i < 3; i++) { 
    for(k = 0; k < 5; k++) { 
     sdp_attributes[i] = malloc(5 * sizeof(char)); 

あなたがsdp_attributes[i]再割り当てされています内側のループの各反復 - それによって毎回それを上書きする。あなたは基本的には下のASCII文字を書いている

sdp_attributes[i][k] = k; 

for(i = 0; i < 3; i++) { 
    sdp_attributes[i] = malloc(5 * sizeof(char)); 
    for(k = 0; k < 5; k++) { 

第二の問題:あなたは、おそらく代わりに、これを望んでいました。それらのほとんどは印刷できません。このような 何かは、あなたがやりたいことがあります。最も内側のループで

sdp_attributes[i][k] = k + '0'; 
3

あなたはおそらくしたい:

for (i = 0; i < 3; i++) 
{ 
    attributes[i] = malloc(5 * sizeof(char)); 
    for (k = 0; k < 5; k++) 
    { 
     attributes[i][k] = k; 
    } 
} 

これは、割り当てのエラーチェックを無視します。

また、宣言と一致するように配列の名前を修正しますが、コードがコンパイルされていない(コンパイルされていないコードを投稿しないでください) sdp_attributesという別の変数が宣言されています。

コードに大量のメモリがリークしていました。 k -loopの都度、5文字の新しい配列が割り当てられ、attributes[i](またはsdp_attributes[i])にポインタが格納され、以前のポインタに新しいポインタが格納されるため、最初の4つのポインタの値が上書きされていました。おそらく最初の4つのアイテムを解放することはできませんでした - 彼らは無責任に失われました。また、最後の反復では、最終配列の5番目の要素を初期化しましたが、前の4つは初期化されていないため、不確定なゴミが含まれていました。

また、印刷ループでは、配列の値は制御文字^ @、^ A、^ B、^ Cおよび^ Dです。これらは、必ずしも%c(特に^ Nではなく、NULまたは'\0'とも呼ばれます)でうまく印刷されるわけではありません。 printf()文がより良いように記述されることがあります。

printf("attributes[%d][%d] [ %d ]\n", i, k, attributes[i][k]); 

これは、配列インデックス(というよりも、単に各エントリの文字[i][k])を印刷し、char値はintときに昇格されているので、整数(のような制御文字を印刷しますprintf()に渡されました)。

(それはまた、ネストされたループのペアのijを使用する方が、従来のだ、とij、および三重ネストされたループなどのためkは、しかし、それは非常にマイナーな問題です。)

+0

エド。私のコードスニペットはそれを短く保っていました。 – ant2009

0
for(i = 0; i < 3; i++) { 
    for(k = 0; k < 5; k++) { 
     sdp_attributes[i] = malloc(5 * sizeof(char)); 
     sdp_attributes[i][k] = k; 
    } 
} 

あなたのたびに割り当てられたメモリを消去しますループ。 ここに正しいバージョンがあります。

for(i = 0; i < 3; i++) { 
    sdp_attributes[i] = malloc(5 * sizeof(char)); 
    for(k = 0; k < 5; k++) { 
     sdp_attributes[i][k] = k; 
    } 
} 

そして、あなたはあなたの宣言を修正する必要があります。

attributes = malloc(3 * sizeof(char*)); 

sdp_attributes = malloc(3 * sizeof(char*)); 

にすべてのメモリを解放することを忘れないでくださいは

for(i = 0; i < 3; i++) 
{ 
    free(sdp_attributes[i]); 
} 
free(sdp_attributes); 
1

に正しい道を割り当てました2d配列に要素を割り当てて割り当てる

一つのことに注意すること:@Mysticialで述べたように、あなたが追加する必要があります/にあなたのint値に「0」を引く、以下のように(これはint配列である、あなたがしようとchar配列のためにそれを変更することができます)ですASCII文字セットを使用する場合はcharの値を取得してください(弊社のitoa()の機能を覚えておいてください)。注意すべき

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

int main() 
{ 
     int row, column; 
     int **matrix; 
     int i, j, val; 

     printf("Enter rows: "); 
     scanf("%d", &row); 
     printf("Enter columns: "); 
     scanf("%d", &column); 

     matrix = (int **) malloc (sizeof(int *) * row); 
     for (i=0 ; i<row ; i++) 
       matrix[i] = (int *) malloc (sizeof(int) * column); 

     val=1; 
     for (i=0 ; i<row ; i++) { 
       for (j=0 ; j<column; j++) { 
         matrix[i][j] = val++; 
       } 
     } 

     for (i=0 ; i<row ; i++) { 
       for (j=0 ; j<column; j++) { 
         printf("%3d ", matrix[i][j]); 
       } 
       printf("\n"); 
     } 

     for (i=0 ; i<row ; i++) 
       free(matrix[i]); 
     free(matrix); 

     return 0; 
} 

いくつかのポイント:

  1. malloc()
  2. malloc() 'EDメモリはfree()でなければなりません' のエラー処理を追加する必要がありますはい、私は自由に使用する
関連する問題