#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 *吗?

#1楼 票数: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指针本身完成工作。

#2楼 票数:2

顺便说一句,您能告诉我为什么我必须在***中放入***吗?

这是一个很好的问题。 顺便说一句,它提供了回答“为什么程序会崩溃”问题的关键。 程序崩溃的原因是您未正确使用矩阵:您将其视为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

演示

#3楼 票数:2 已采纳

你有几个问题

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

  2. 你释放tab[i]元件,其是NULLcreateMatrix()您在循环内malloc数组的指针。

    你应该做的是

     free(tab); 

    代替。

  3. 您永远不会return malloc ed tab

  4. 您的fillMatrix()函数不必要地使用了一个int ***三重指针,您不需要这样做,如果您传递该指针,则可以直接修改数据。

  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指针。

这是您的代码,已解决所有这些问题。

#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;
}

#4楼 票数:1

您询问:

顺便说一句,您能告诉我为什么我必须在fillMatrix中放入3x *吗?

那是没有必要的。 您可以使用:

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);
      }
   }
}

  ask by Otwrate translate from so

未解决问题?本站智能推荐:

2回复

用循环填充二维数组

因此,我的作业需要创建一个虚拟的“木板”,并用“碎片”填充它,然后移动碎片等。但是,我无法弄清楚如何用空碎片填充数组。 我才刚刚开始学习c。 这是我为董事会准备的代码: 这是初始化电路板的代码: 如果有帮助的话,这是我用于游戏和初始化的代码
2回复

在for循环中填充二维数组

我想在for循环中填充一个二维数组。 但是,这不起作用。 我不知道为什么... test.c:在函数'main'中:test.c:27:14:错误:'{'令牌ar [i] [i] = {{i + 1,x},{}}之前的预期表达式; 为什么不填充数组?
5回复

填充二维数组C

声明一个8X8整数数组my_data 提示用户输入数据以填充8X8数组my_data 打印每一行所有元素的总和 打印8X8数组中所有元素的总和 打印8x8数组对角线上所有元素的总和。 我做错了什么? 当我输入1,2,3,4,5,6,7,8; 1,2,3,4,5,
1回复

用空格C填充二维数组

我有一个字符串 我必须将它插入一个名为board的二维数组中。 所以就像一行我有 12313b,第二个 122a34679。 a = 一个空格, b = 两个空格, c = 三个空格等等。 如果像 12313b 这样的字符串小于 9,我必须用空格填充板。 例如:12313b 板 12313""""
1回复

从文件填充二维数组[关闭]

关闭。 这个问题需要调试细节。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack O
4回复

用C填充二维数组

我声明了一个数组“ a [3] [3]”(3 x 3),用户必须用9个整数填充它。 我正在使用此代码: 在我输入数字0 1 2 3 4 5 6 7 8并尝试打印后,它输出: 0 0 0 1 0 0 2 0 0 问题是什么?
2回复

正确填充二维数组

我被卡在适当的位置。 我无法提出算法,因此将填充方阵,如下所示: “从用户n中获得不超过20的自然数n。如下所示填写方表。主对角线以下的数字(a21; a31; a32等)由用户给出。” #include <stdio.h> int main() { int tab[
1回复

用于填充二维数组的逻辑

我正在寻找一个通用逻辑来填充一个只有0和1的双维数组,并提供Row_wise_sum和Column_wise_sum。 下面是我的示例代码,但逻辑不起作用。 请注意:Col的安排顺序无关紧要。 说Row的顺序很重要,RowSum和ColSum应该完全符合预期。 另一个例外/条件是A