2014-12-27 2 views
3

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

Вот основной():

int main(void) 
{ 
int i=0,j=0,n=0,n2=0;  
double **a, **a1, b=0; 

printf("Enter 'n2' :"); 
scanf("%d", &n2); 


a= makearray(n2); 
for(i=0; i < n2; i++){ 
    for(j=0; j < n2; j++){   
     a[i][j] = j; 
     printf("%.f ",a[i][j]); 
    } 
    printf("\n"); 
    } 

printf("\n\n\n"); 

for(i=0; i < n2; i++){ // print a 
     for(j=0; j < n2; j++){ 
     b = a[i][j]; 
     printf("%.f ", b); 
    } 
    printf("\n"); 
} 

printf("\n\n\n"); 
return 0; 
} 

Функция makearray() просто возвращает указатель на указатель для 2D массив размера, переданного в качестве аргумента.

makearray() является:

double** makearray(int n2) 
{ 
int i=0; 
double** a; 

a = malloc(n2 * sizeof(int *)); 
if(a == NULL){ 
    fprintf(stderr, "out of memory\n"); 
    exit(0); 
    } 

for(i = 0; i < n2; i++){ 
    a[i] = malloc(n2 * sizeof(int)); 
    if(a[i] == NULL){ 
     fprintf(stderr, "out of memory\n"); 
     exit(0); 
     } 
    } 

return a; 

} 

Вы можете ввести 'п2', где (п2 х п2) становится размер матрицы, и с п = 9, выход:

0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 

0 1 2 3 4 5 0 1 2 
0 1 2 3 4 5 0 1 2 
0 1 2 3 4 5 0 1 2 
0 1 2 3 4 5 0 1 2 
0 1 2 3 4 5 0 1 2 
0 1 2 3 4 5 0 1 2 
0 1 2 3 4 5 0 1 2 
0 1 2 3 4 5 0 1 2 
0 1 2 3 4 5 6 7 8 

Я никоим образом не изменил первый массив, просто напечатал его снова, любые идеи, почему эти два разные?

+1

когда вы 'выход (0)' не 'free' массив, вероятно, OS будет, но я не думаю, что это хорошая практика, чтобы сделать это. –

+1

'sizeof (int *)', 'sizeof (int)' at 'makearray':' int' -> 'double' – BLUEPIXY

+1

Я заметил, что вы никогда не называете' free', вы должны. А также, когда у вас есть такая проблема, вы должны использовать отладчик, это сэкономит вам массу проблем. –

ответ

3

В вашем makearray malloc использует sizeof(int), но вы создаете массив для double s. Ints обычно используют 4 bytes, но double s используют 8 bytes. Таким образом, вы не malloc - достаточно памяти для 2-мерного массива двойников.

+0

Помимо того, что я выгляжу невероятно неумелым в этом, вывел ли указанный выше (ошибочный) вывод, что указатель обертывался на себя? какие-либо идеи о том, как он опустился на значениях 0, 1, 2 на последних трех столбцах? – namehttp404

+0

Так как вам нужны строки из 9 двухместных (9 * 8 = 72 байта), но в итоге они состоят из строк из 9 целых чисел (9 * 4 = 36 байт), когда вы назначили 9 удвоений, вы закончили писать пропускную строку с индексом в следующую ячейку памяти. Затем, когда эта строка назначила свои значения, она перезаписала последние значения из первой строки. Это продолжается до последней строки, которая не перезаписывается, но память, на которую он вписал, не была выделена и в конечном итоге может быть использована в какой-то момент другим. – Dtor

+0

хорошо, что-то я полностью упустил, приветствует невероятно быстрый ответ! – namehttp404

3

Try:

double** makearray(int n2) 
{ 
int i=0; 
double** a; 

a = malloc(n2 * sizeof(double *)); //<- was sizeof(int *) 
if(a == NULL){ 
    fprintf(stderr, "out of memory\n"); 
    exit(0); 
    } 

for(i = 0; i < n2; i++){ 
    a[i] = malloc(n2 * sizeof(double)); //<- was sizeof(int) 
    if(a[i] == NULL){ 
     fprintf(stderr, "out of memory\n"); 
     exit(0); 
     } 
    } 

return a; 

} 
+0

о да! работает отлично! ура! – namehttp404

Смежные вопросы