2016-11-04 8 views
0

私は次元が[N] [M]で、Mが偶数の2次元配列を指すポインタを持っています。私は次のようにメモリを割り当てる定義:内容を比較する2次元ポインタC

//alocate the memory of indxs pointer containing the indexs of each matrix element 

int **indxs; 
indxs = (int**) malloc(N*sizeof(int *)); 
for(i = 0; i<N; i++){ 
    indxs[i] = (int *) malloc(M*sizeof(int)); 
} 

いったん要素indxs[i_N][:M/2]の前半要素indxs[i_N][M/2:]の第二の半分に等しい場合、私は、各行(値In)のために比較する充填しました。この[:M/2]はPythonの表記法ですが、私はどのようにCでそれをするのかわかりません、どんな提案?

int *a = something; 
int *b = something; 
*a==*b 

をしかし、どのように、これは私の場合で行うことができます:私は最初にデリファレンスへの2つのポインタの内容を比較するためにあなたが持っている別の記事で読んだことがありますか?

+0

通常のwarnig:[malloc()の結果をキャストしない](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – Quentin

答えて

0

一度I、要素indxs[i_N][:M/2]の前半要素indxs[i_N][M/2:]の第二の半分に等しい場合、各行(値In)のために比較する充填しました。この[:M/2]はPythonの表記ですが、私はCでそれを行う方法がわからない

あなたはこのように見えることがあり、この場合memcmp、使用することができます。memcmp戻り0に等しい場合

memcmp(indxs[i_N][0], indxs[i_N][M/2], (M/2)*sizeof(int)) 

注意を。また、あなたがmallocのためにキャストを取り除く必要があります

#include <string.h> 

    int memcmp(const void *s1, const void *s2, size_t n); 

注:memcpyプロトタイプチェックアウト全ての

indxs = malloc(N*sizeof(int *)); 
2

まず、これは2D配列が、ルックアップテーブルではありません。

あなたはこのようなあなたのルックアップテーブル内の行を比較することができます。各「行」は、実際の配列を指しているので、

#include <string.h> 

if(memcmp(&indxs[i_N][0], 
      &indxs[i_N][M/2], 
      (M/2)*sizeof(indxs[0][0])) == 0) 
{ 
    puts("equal"); 
} 

これが正常に動作します。アレイ=隣接するメモリにメモリセルが割り当てられているもの。

ただし、2D配列を持たないため、すべての行の割り当てがヒープ全体に分割されているため、「列」でこれを行うことはできません。たとえば、memcmp(indxs[0], indxs[n/2], (n/2)*sizeof(indxs[0][0]))がクラッシュして焼損します。代わりに2D配列を使用してこれを解決してください。

+0

ありがとうございます。私は別の質問があります。私は列を比較する必要はありませんが、これは「悪い習慣」だと思いますか?代わりに2D配列を使うべきですか? –

+0

@KilianArteagaGutierrez「ポインタの配列へのポインタ」ルックアップテーブルを使用することが唯一の意味を持つのは、各行が個別の長さ(動的文字列テーブルのような)を持つ必要がある場合です。それを避ける方法はありません。他のすべての場合、単純にサイズ[n] [m]の行列が必要な場合、ルックアップテーブルは実際には悪い習慣であり、決して使用すべきではありません。私はSOの前にこのことについてたくさん書いています。例えば、[here](http://stackoverflow.com/a/32050859/584518)です。 – Lundin

関連する問題