C 用多应用表填充二维数组

C 用多应用表填充二维数组,c,C,嗨!我需要写一个程序,使二维数组,我想填写他们的乘法表。程序编译时没有任何警告或错误,但在输入puttintan后崩溃。顺便问一下,你能告诉我为什么我要在fillMatrix中加上3x* #include<stdio.h> #include<stdlib.h> int** createMatrix(int n) { int i, a, **tab,x; tab=(int**)malloc(n*sizeof(int*)); if(tab==0) {

嗨!我需要写一个程序,使二维数组,我想填写他们的乘法表。程序编译时没有任何警告或错误,但在输入puttintan后崩溃。顺便问一下,你能告诉我为什么我要在fillMatrix中加上3x*

#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;
}
您应该从函数返回双指针,我看到您没有这样做

#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;
}
int** createMatrix(int n)
注意使用三重指针访问元素。像

#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;
}
int** createMatrix(int n)
{
int i, a, **tab,x;
tab=(int**)malloc(n*sizeof(int*));
// Do your allocations and other stuff

return tab;
}
您可以使用双指针本身完成任务

#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;
}
顺便问一下,你能告诉我为什么我要把***放在矩阵里吗

#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数组,而不是指向2D数组的指针。如果添加括号,程序将停止崩溃:

#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;
}
(*tab)[i][a] = (a*i);
更好的方法是,更改程序以获取所需的**:

#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;
}
(*tab)[i][a]=(a*i);
注意:编译程序时,应该看到控件到达非void函数的末尾,但没有返回值。这是因为您忘记在创建矩阵的函数末尾添加return选项卡

#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;
}
你问:

#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;
}
顺便问一下,你能告诉我为什么我要在fillMatrix中加上3x*

#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;
}
这是没有必要的。您可以使用:

#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;
}
void fillMatrix(int** tab, int n) {
    ...
    tab[i][a]=(a*i); // <<== No asterisk
}
...
fillMatrix(tab, roz); // <<== No ampersand

你有几个问题

#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;
}
createMatrix函数中的无意义freetab,它位于return语句之后,永远不会执行

#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;
}
在循环内释放createMatrix中为空的tab[i]元素,在循环中malloc数组指针

#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;
}
你应该做的是

#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;
}
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);
      }
   }
}
相反

#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;
}
您永远不会返回malloced选项卡

#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;
}
fillMatrix函数不需要使用int***三重指针,如果传递指针,则直接修改数据

#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;
}
fillMatrix中存在运算符优先级问题

#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;
}
这并不意味着你所想的,首先应用[],然后用*取消引用它,这相当于

#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;
}
*tab[i][a] = (a*i);
你想要的是

#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;
}
*(tab[i][a]) = (a * i); -> *(tab[i][a]) -> tab[i][a][0]
打印指针后,不会释放指针

#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;
}
这是您的代码,所有这些问题都已修复

#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;
}
(*tab)[i][a] = a * i;

请阅读。您实际上不必将矩阵作为三指针int***传递给fillMatrix函数。如果要更新指针本身(例如,调整矩阵大小时),则只需这样做。如果只更改第一级或第二级内容,以int**的形式传递就足够了。编译时不会出现警告,即使如@Gopi所写,createMatrix并不总是返回值?或者在不释放选项卡之前返回NULL。@iharob抱歉,为什么您回答的这个问题解释得很好