2013-09-02 3 views
0

Это настоящий случай из головоломки.О указателях, массиве и malloc

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

    #define ROWS 10 
    #define COLS 8 

    void process_array(int array[ROWS][COLS]) { 
      int i,j, count =0; 
      for (i=0; i< ROWS ;i++) 
        for(j=0 ; j<COLS; j++) 
         array[i][j]= count++; 



    } 

    int main() { 
    int **array = malloc(sizeof(int)*ROWS*COLS); 
    process_array(array); 

    /** int i,j; 
     for (i=0; i< ROWS ;i++){ 
        for(j=0 ; j<COLS; j++) 
         printf("%d ",array[i][j]); 
        printf("\n"); 
     } 
    **/ 

     return 0; 

    } 

Вопросы.

(a) Боб хочет знать, является ли код Алисы правильным. Он удаляет код из строки 21 в строку 26 для вывода содержимого массива. Какой результат он получит?

(b) Алиса настаивает на том, что ее код абсолютно прав (это правда). Как может он исправляет проблему, если Бобу нужно получить доступ к массиву в основной функции через операторы подписчика (т. Е. array[i][j])?

(с) Алиса меняет ее подпись функции

void process_array (int ** array) ; 

Что является/являются соответствующими изменения (ы) должны Бобу сделать на основную функцию?

(d) Еще один ученик Чарли советует Бобу и Алисе использовать одномерный массив для имитировать двумерный массив. Затем Боб модифицирует строку 18 вышеуказанного кода, как следует из .

int * array=malloc (sizeof (int) *ROWS *COLS) ; 

Каковы дальнейшие изменения, которые он должен внести в остальную часть кода? Пусть предположим, что Алиса хочет вернуться к своей первоначальной реализации.

Пожалуйста, помогите мне. Спасибо большое.

+3

Пахнет домашней работой – Paddyd

+0

Это моё головоломка C и хочу, чтобы я подумал глубже в указателе –

+1

Вот почему вы должны сначала попытаться ответить на вопросы, а затем обратиться за помощью. Вы не узнаете много, попросив ответы! – Paddyd

ответ

1

У вас типичный случай несоответствия типа. int ** array; - это не то же самое, что и int array[5][6];. Первый дает вам int* о разыменовании, второй - массив из 6 int s.

(a) Боб получил бы SIGSEGV относительно быстро, потому что он определил int **, но функция Алисы ожидает int (*)[COLS], и это то, что Боб фактически выделил для памяти.

(б) Боб должен был бы определить array, как

int (*array)[COLS] = malloc(sizeof(int)*ROWS*COLS); 

или просто передать его в стек

int array[ROWS][COLS]; 

(с) Выделение памяти для каждой строки.

int ** array = malloc(sizeof(int*) * ROWS); 
size_t i; 
for (i = 0; i < ROWS; i++) 
    array[i] = malloc(sizeof(int) * COLS); 

(d) Использовать соответствующий тип, см. Выше.

+0

Как окрасить код ??? –

+0

@Clearner Что значит? в stackoverflow он окрашивается автоматически. –

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