1

Я читал об этом, и я применяю то, что я читал к своему коду, но я не уверен, что у меня что-то не хватает. судоку. Я знаю, что проблемная область находится в моей функции arrayMake. Мой профессор рекомендовал использовать бросок с вызовом malloc так: sudoku = (int**)malloc(sudokus*sizeof(int*));, но это не сработало для меня.Динамическое выделение 2D-массива в C

int main(){ 
    int sudokus; 
    int** sudoku; 
    sudokus = getUserInfo(); 
    sudoku = arrayMake(sudokus); 
    /*for (int i = 0; i < (SIZE*sudokus), i++;){ 
     for (int j = 0; j < SIZE, j++;){ 
      printf("Numbers[%d][%d]:%d", i, j, sudoku[i][j]); 
     } 
    }*/ 
    system("pause"); 
    return 0; 
} 

int getUserInfo(){ 
    int sudokus; 
    printf("How many Sudokus are you checking today?\n"); 
    scanf("%d{^\n]\n", &sudokus); 

    return sudokus; 
} 

int** arrayMake(int sudokus){ 
    int **sudoku; 
    int realsize; 
    realsize = 9 * sudokus; 

    sudoku = malloc(realsize*sizeof(int*)); 
    if (sudoku == NULL){ 
     printf("Memory allocation failed"); 
     return 0; 
    } 
    for (int i = 0; i < realsize, i++;){ 
     sudoku[i] = malloc(9 * sizeof(int)); 

     if (sudoku[i] == NULL){ 
      printf("Memory allocaiton failed"); 
      return 0; 
          } 

    } 

    return sudoku; 
} 
+0

Вы хотите выделить массив _pointers_ или массив _ints_? – e0k

+0

Возможно, я немного смущен, поскольку то, что я планировал делать, это распределение строк так, 9 строк * пользовательский ввод, потому что пользователь может вводить несколько судокусов. то я хотел всего 9 столбцов. Итак, я бы предположил массив указателей, указывающих на ints? – Jude

+1

Чтобы выделить двумерный массив 'int', просто выделите количество строк, умноженное на количество столбцов times 'sizeof (int)'. Вам не нужно создавать новое распределение для каждой строки или каждого столбца. – e0k

ответ

3

Мой профессор рекомендовал использовать слепок с таНос вызова так: судоку = (INT **) таНос (судоку * SizeOf (INT *)); но это не сработало для меня.

Чтобы динамически выделить для 2D-массива, вам обычно нужно выполнить два шага. Ваш код нечеткий, поскольку вы включаете realsize = 9 * sudokus, что не имеет смысла. Во всяком случае, для простоты давайте предположим, что ваш судоку является матрицей 3x3. Вам нужно:

  1. Выделяют для указателя на указатель на INT:

    int **sudoku = malloc(3 * sizeof(int *)); 
    
  2. Выделяют для каждого отдельного указателя INT:

    for(int i = 0; i < 3; i++) 
        sudoku[i] = malloc(3 * sizeof(int)); 
    
+0

Хорошо, чтобы код имел смысл, причина, по которой я имел дело, состоит в том, что пользователь должен иметь возможность вводить количество решеток sudoku (так, сколько сеток 9x9) он собирается ввести в программу. Я пытался найти способ увеличить количество строк, сохраняя 9 столбцов. Я предполагаю, что вы это сделаете, изменив первый вызов malloc? – Jude

+0

Вам нужно изменить оба звонка 'malloc' на 9 вместо 3. – artm

+0

Algiht yea Его все работает отлично, даже теперь это получилось с calloc, спасибо! – Jude

2

Из того, что я вижу, ваша проблема существует в ваших петлях for, где у вас есть:

for (i = 0;i < realsize , i++)

, когда вы на самом деле имел в виду:

for (i = 0;i < realsize ; i++) ^ Обратите внимание на изменение , к ;

0

scanf("%d{^\n]\n", &sudokus); является ошибкой.

Я предполагаю, что вы имели в виду {, чтобы на самом деле быть [, но строка формата по-прежнему ошибочна даже после этого изменения. Я думаю, вы намеревались использовать остальную часть ввода, вплоть до символа новой строки. Однако ваша строка формата на самом деле не делает этого.

Scanf'ing для \n фактически означает потреблять любое количество пробелов, поэтому на самом деле этот код (с [ затруднительными) будет продолжать ожидание ввода, пока не была новой строкой, а также другой непробельным введенного символа после новой строки.

Лучше бы:

scanf("%d", &sudokus); 
int ch; 
while ((ch = getchar()) != '\n' && ch != EOF) { } 

Есть несколько различных способов для достижения той же цели. (Обратите внимание, что сканирование для %d[^\n]%c не является одним из них, эта строка также сломана).

Также я бы предложил другое имя переменной, чем sudokus. Это путается наличие двух одинаково названных переменных sudoku и sudokus. Назовите это что-то, что отражает его значение.


Для выделения вашего массива, было бы гораздо проще взять на себя функцию arrayMake и написать что-то вроде:

int sudoku[9][9]; 

(я не мог понять, что sudokus должен был означать или то, что realsize будет, но вы можете поместить свой размер в квадратные скобки там).

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