使用动态内存分配在二维数组中添加值

时间:2015-12-29 17:34:14

标签: c arrays memory dynamic allocation

鉴于此任务:

  

编写一个程序,分配必要的内存量来存储来自两个[m x n]整数矩阵的元素。

我不知道如何为2维数组分配内存 我读了一些例子,但我没理解。

#define _CRT_SECURE_NO_WARNINGS
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define DIM 10


void main()
{
    int **m, *n;
    int i = 0, j = 0;
    int diml, dimc;;
    puts("Introduceti dimensiunea matricelor(linii|coloane)");
    scanf("%d%d", &diml, &dimc);
    m = (int**)malloc(dimc*sizeof(int));
    puts("Introduceti elementele primei matrici:");
    for (j = 0;j < dimc;j++)
    {
        m[i] = (int *)malloc(diml*(sizeof(int)));
    }
    for (j = 0;j < dimc;j++)
    {
        for (i = 0;i < diml;i++)
        {
            printf("tab[%d][%d]= ", j + 1, i + 1);
            scanf("%*d", m[j][i]);

        }
    }
    _getch();
}

我输入第一行后程序崩溃。

Introduceti dimensiunea matricelor(linhi I coloane)
3
3
Introduceti elementele primei matrici:
ab[1][1]= 2
ab[1][2]= 1
ab[1][3]= 2
ab[2][1]=

Problema 3.exe has stopped working
A problem caused the program to stop working correctly.
Windows  will  closethe program and notify you if a solution is
available.

2 个答案:

答案 0 :(得分:3)

  1. 通过根据对象的大小而不是 type 的大小进行分配,避免使用错误的大小进行分配的错误。如果sizeof(int)小于sizeof(int *),这将解释OP的问题。

    // m = (int**)malloc(dimc*sizeof(int));   // Original
    // m = (int**)malloc(dimc*sizeof(int *)); // corrected type
    // m = malloc(dimc*sizeof(int *));        // cast not needed
    m = malloc(sizeof *m * dimc);             // best : sizeof object
    
  2. 使用正确的索引ji @BLUEPIXY。这肯定是OP的问题。

    for (j = 0;j < dimc;j++) {
      // m[i] = (int *)malloc(diml*(sizeof(int)));
      m[j] = malloc(sizeof *(m[j]) * diml);
    
  3. 确保编译器警告完全启用 - 它应该已经捕获了这个警告。

    // scanf("%*d", m[j][i]);
    scanf("%d", &m[j][i]);
    
  4. 建议检查malloc()scanf()的结果。

    #include <stdlib.h>
    
    m[j] = malloc(sizeof *(m[j]) * diml);
    if (m[j] == NULL && diml != 0)) {
      fprintf(stderr", "Out of memory\n");
      return EXIT_FAILURE;
    }
    
    if (scanf("%d", &m[j][i]) != 1) {
      fprintf(stderr", "Non-numeric input\n");
      return EXIT_FAILURE;
    }
    
  5. main()应该返回int

    #include <stdlib.h>
    int main(void) {
      ...
      return EXIT_SUCCESS;
    }
    
  6. 促销时,确保输出打印并且不缓冲。使用fflush()或以'\n'结束提示。

       printf("tab[%d][%d]= ", j + 1, i + 1);
       fflush(stdout);  // add
       scanf(...
    

答案 1 :(得分:0)

你应该首先这样分配:

m = (int**)malloc(dimc*sizeof(int*));

之后你会这样分配:

m[i] = (int *)malloc(sizeof(int));