用乘法表填充2d数组

时间:2015-01-14 18:27:23

标签: c

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

int** createMatrix(int n)
{
   int i, a, **tab,x;
   tab=(int**)malloc(n*sizeof(int*));
   if(tab==0)
   {
      return NULL;
      free(tab);
   }
   for(i=0;i<n;i++)
   {
      tab[i]=(int*)malloc(n*sizeof(int));
      if(tab[i]==NULL)
      {
         for(x=0;x<i;x++)
         {
            free(tab[x]);
         }
         free(tab[i]);
         return NULL;

      }
   }
}

void fillMatrix(int*** tab, int n)
{
   int i, a;
   for(i=0;i<n;i++)
   {    
      for(a=0;a<n;a++)
      {
         *tab[i][a]=(a*i);
      }
   }
}

int main()
{
   int roz, **tab,i,x;
   printf("size of the array: \n");
   scanf("%d",&roz);
   tab=createMatrix(roz);
   if(tab==NULL)
   {
      printf("error");
      return -1;
   }
   fillMatrix(&tab, roz);
   for(i=0;i<roz;i++)
   {
      printf("\n");
      for(x=0;x<roz;x++)
         printf("%d",tab[i][x]);
   }
   return 0;
}

嗨!我需要编写一个生成2d数组的程序,我想用乘法表填充它们。程序编译没有单个警告或错误,但在puttintan输入后它崩溃。顺便问一下,你能告诉我为什么我必须在fillMatrix中加入3x *吗?

4 个答案:

答案 0 :(得分:3)

int** createMatrix(int n)

你应该从我看到你没有做的函数返回双指针。

int** createMatrix(int n)
{
int i, a, **tab,x;
tab=(int**)malloc(n*sizeof(int*));
// Do your allocations and other stuff

return tab;
}

使用三重指针来处理元素。像

(*tab)[i][a] = (a*i);

您可以使用doule指针自行完成工作。

答案 1 :(得分:2)

  

顺便问一下,你能告诉我为什么要把***放在fillMatrix中吗?

这是一个很好的问题。顺便提一下,它提供了回答“为什么我的程序崩溃”问题的关键。程序崩溃的原因是你正在错误地使用矩阵:你把它当作2D指针数组,而不是指向2D数组的指针。如果添加括号,程序将停止崩溃:

(*tab)[i][a]=(a*i);

更好的是,更改程序以获取所需的**

void fillMatrix(int** tab, int n) {
    ...
    tab[i][a]=(a*i); // <<== No asterisk
}
...
fillMatrix(tab, roz); // <<== No ampersand

注意:编译程序时,应该看到“控件到达非void函数的末尾而不返回值”。这是因为您忘记在创建矩阵的函数末尾添加return tab

Demo.

答案 2 :(得分:2)

你有几个问题

  1. free(tab)函数中的无效createMatrix(),在return语句之后,它将永远不会被执行。

  2. 您释放了tab[i]NULL元素,createMatrix()位于您malloc数组指针的循环内。{/ p>

    你应该做的是

    free(tab);
    

    代替。

  3. 您永远不会return malloc编辑tab

  4. 您的fillMatrix()函数不必使用int ***三重指针,您不需要它,如果您通过指针直接修改数据。

    < / LI>
  5. fillMatrix()

    中存在运算符优先级问题
    *tab[i][a] = (a*i);
    

    这并不代表您的想法,首先应用[],然后使用*取消引用它,这相当于

    *(tab[i][a]) = (a * i); -> *(tab[i][a]) -> tab[i][a][0]
    

    你想要的是

    (*tab)[i][a] = a * i;
    
  6. 打印后,您不必free指针。

  7. 这是修复所有这些问题的代码。

    #include <stdio.h>
    #include <stdlib.h>
    
    int **createMatrix(int n)
    {
        int i, **tab, x;
    
        tab = malloc(n*sizeof(int*));
        if (tab == 0)
            return NULL;
    
        for (i = 0 ; i < n ; i++)
        {
            tab[i] = malloc(n * sizeof(int));
            if (tab[i] == NULL)
            {
                for (x = 0 ; x < i ; x++)
                    free(tab[x]);
                free(tab);
    
                return NULL;
            }
        }
    
        return tab;
    }
    
    void fillMatrix(int **tab, int n)
    {
        int i, a;
        for (i = 0 ; i < n ; i++)
        {
            for (a = 0 ; a < n ; a++)
            {
                tab[i][a] = (a*i);
            }
        }
    }
    
    int main()
    {
        int roz, **tab, i, x;
    
        printf("size of the array: \n");
        scanf("%d", &roz);
        tab = createMatrix(roz);
        if (tab == NULL)
        {
            printf("error");
            return -1;
        }
        fillMatrix(tab, roz);
    
        for (i = 0 ; i < roz ; i++)
        {
            printf("\n");
            for (x = 0 ; x < roz ; x++)
                printf("%4d ", tab[i][x]);
            printf("\n");
            free(tab[i]);
        }
        free(tab);
    
        return 0;
    }
    

答案 3 :(得分:1)

你问:

  

顺便问一下,你能告诉我为什么要把3x *放在fillMatrix中吗?

这不是必要的。你可以使用:

void fillMatrix(int** tab, int n)
{
   int i, a;
   for(i=0;i<n;i++)
   {    
      for(a=0;a<n;a++)
      {
         tab[i][a]=(a*i);
      }
   }
}