2016-11-04 3 views
0

У меня есть указатель, указывающий на 2D-массив из целых чисел с размерами [N] [M] с М четным. Я определяю это выделение памяти следующим образом:Сравнить содержимое 2D-указатели 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)); 
} 

После заполнения Я хочу сравнить для каждой строки (i_n), если первая половина элементов indxs[i_N][:M/2] равна второй половины элементов indxs[i_N][M/2:]. Это [:M/2] - это обозначение Python, я не знаю, как это сделать в C, любое предложение ?. Я прочитал в другом посте, что для сравнения содержимого двух указателей вы должны разыменовать их первыми:

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

Но как это может быть сделано в моем случае?

+0

Обычный предупреждать: [никогда не приводить результат 'malloc()'] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). – Quentin

ответ

0

После заполнения Я хочу сравнить для каждой строки (i_n), если первая половина элементов indxs[i_N][:M/2] равна второй половины элементов indxs[i_N][M/2:]. Это [:M/2] является Python нотации, я не знаю, как сделать это в C

Вы можете использовать memcmp, который в этом случае может выглядеть следующим образом:

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

Примечание memcmp возвращает 0, если равно , Проверьте memcpy прототип:

#include <string.h> 

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

Обратите также внимание, вы должны избавиться от гипсе malloc:

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, например [здесь] (http://stackoverflow.com/a/32050859/584518). – Lundin