2015-02-28 2 views
-1

Я сделал программу, которая добавляет две матрицы и выводит их сумму с максимальной размерностью 100.Преобразования 2d массив коды C в таНос

/* This program asks the user for 2 matrices called A and B, as integers, 
    and displays their sum, C. The max dimension of each matrix is 100. */ 

#include <stdio.h> 

// Construct function 
void construct() 
{ 
    int m, n, i, j;  // Variables 
    int first[100][100], second[100][100], sum[100][100]; // Matrices variables 

    printf("Please enter the number of rows: "); 
    scanf("%d", &m); 
    printf("Please enter the number of columns: "); 
    scanf("%d", &n); 

    // User enters m x n amount whole numbers for the Matrix A 
    printf("Enter Matrix A\n"); 
    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
     scanf("%d", &first[i][j]); 

    // User enters m x n amount whole numbers for the Matrix B 
    printf("Enter Matrix B\n"); 
    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
      scanf("%d", &second[i][j]); 

    // Adds the sum of Matrix A and Matrix B 
    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
     sum[i][j] = first[i][j] + second[i][j]; 

    // Display the sum of Matrix A and Matrix B 
    printf("A + B =\n"); 
    for (i = 0; i < m; i++) 
    { 
     for (j = 0; j < n; j++) 
     printf("%d ", sum[i][j]); 

     printf("\n"); // Prints new line 
    } 

    return ; 
} 

// Main Function 
int main() 
{ 
    construct(); // Calls construct function 
    return 0; 
} 

Теперь мне нужно изменить его так, что нет размера макс для каждого матрица. Поэтому мне нужно использовать malloc для создания моих массивов. Поэтому я не могу использовать int A [rows] [cols]. Это то, что я сделал для скрытых массивов в malloc. Он компилируется, но он падает после ввода всех целых чисел. Нужна помощь.

/* This program asks the user for 2 matrices called A and B, as integers, 
    and displays their sum, C. The max dimension of each matrix is 100. */ 

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

// Construct function 
void construct() 
{ 
    int m, n, i, j;  // Variables 
    int *first = NULL; 
    int *second = NULL; 
    int *sum = NULL; // Matrices variables 

    printf("Please enter the number of rows: "); 
    scanf("%d", &m); 
    printf("Please enter the number of columns: "); 
    scanf("%d", &n); 

    first = (int*)malloc(m * sizeof(int)); 
    second = (int*)malloc(n * sizeof(int)); 
    sum = (int*)malloc(m * n * sizeof(int)); 


    // User enters m x n amount whole numbers for the Matrix A 
    printf("Enter Matrix A\n"); 
    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
     scanf("%d", &first); 

    // User enters m x n amount whole numbers for the Matrix B 
    printf("Enter Matrix B\n"); 
    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
      scanf("%d", &second); 

    // Adds the sum of Matrix A and Matrix B 
    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
     sum = *first + *second; 

    // Display the sum of Matrix A and Matrix B 
    printf("A + B =\n"); 
    for (i = 0; i < m; i++) 
    { 
     for (j = 0; j < n; j++) 
     printf("%d ", sum); 

     printf("\n"); 
    } 

    return ; 
} 

// Main Function 
int main() 
{ 
    construct(); // Calls construct function 
    return 0; 
} 
+0

См. Http://stackoverflow.com/questions/25984700/setup-a-2d-array-change-size-later-c/25984834#25984834 –

+0

1) возвращаемое значение из scanf() всегда должно быть проверено на убедитесь, что вход/конверсия прошла успешно. 2) в C, возвращаемое значение из malloc не должно быть отлито. 3) возвращаемое значение из malloc всегда должно быть проверено (! = NULL), чтобы гарантировать успешную операцию – user3629249

+0

этот тип строки: 'canf ("% d", & first);' всегда будет вводить входное значение в том же месте в области malloc, d, в частности, в первых первых 4 байтах. \ – user3629249

ответ

2

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

int first[m][n]; 

printf("Enter Matrix A\n"); 
for (i = 0; i < m; i++) 
    for (j = 0; j < n; j++) 
     scanf("%d", &first[i][j]); 

и аналогично для second и sum.

Если матрицы могут быть больше 100x100, тогда было бы полезно использовать malloc, чтобы избежать риска переполнения стека; способ сделать это:

int (*first)[n] = malloc(m * sizeof *first); 

printf("Enter Matrix A\n"); 
// etc. 

и в конце концов, free(first);. Никаких других изменений не требуется.


В вашей попытке использовать таНос, вы не выделить достаточно места, и вы не scanf в пространство вы выделяемой либо (вместо этого вы перезаписали указатель на выделенное пространство).

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