2016-11-21 3 views
0

Итак, у меня есть следующая функция. Функция принимает целевой int ** двойной указатель и копирует исходный массив.Скопируйте массив 2d int в двойной указатель в C

void copyMatrix(int ** target, int m, int n, int source[m][n]) 
{ 
    int i,j; 

    target = (int **) malloc(m * sizeof(int *)); 
    for (i = 0; i < m; i++) 
    target[i] = (int *)malloc(n * sizeof(int)); 

    for(i=0; i < m; i++){ 
    for(j=0; j < n; j++){ 
    target[i][j] = source[i][j]; 
    } 
    } 
    printf("%d ", target[i][j]); 
} 

Когда я называю Printf после того, как для петель, я получаю ошибку сегментации, но если я называю Printf внутри для петель, он печатает мишень [я] [J] правильно. Почему это? Я разорву свои волосы за это ...

+2

Что вы ожидаете от значения 'i' и' j' вне цикла? – nullpointer

+4

Вам нужно будет передать указатель на ваш '** target', поэтому он станет' *** target'. А затем используйте '* target = ...' при распределении. В настоящее время вы пытаетесь изменить сам (двойной) указатель, а не значение, на которое оно указывает. – Evert

+1

Также смотрите http://stackoverflow.com/a/7307699/1746118 – nullpointer

ответ

1

После петель, i == m и j == n. Они оба указывают 1 пункт за макс. Массивы в C индексируются с нулевой отметкой, поэтому доступ к target[n][m] массива с размером [n][m] даст доступ за пределы границ.

0

Непонятно, почему вы хотите сначала создать массив указателей. При таком подходе у вас возникает проблема изменения самого двойного указателя, который не будет отображаться в вызывающем. Вы можете просто выделить массив непосредственно для хранения входного 2D-массива.

Ваш код:

void copyMatrix(int ** target, int m, int n, int source[m][n]) 
{ 
    int i,j; 

    target = (int **) malloc(m * sizeof(int *)); 
    for (i = 0; i < m; i++) 
    target[i] = (int *)malloc(n * sizeof(int)); 

    for(i=0; i < m; i++){ 
    for(j=0; j < n; j++){ 
    target[i][j] = source[i][j]; 
    } 
    } 
    printf("%d ", target[i][j]); 
} 

Модифицированный код:

void copyMatrix(int ** target, int m, int n, int source[m][n]) 
{ 
    int i,j; 

    *target = (int *) malloc(sizeof(int) * (m * n)); 


    for(i=0; i < m; i++){ 
    for(j=0; j < n; j++){ 
    (*target)[i][j] = source[i][j]; 
    } 
    } 
    printf("%d ", (*target)[i][j]); 
} 
Смежные вопросы