#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 *吗?
答案 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
。
答案 2 :(得分:2)
你有几个问题
free(tab)
函数中的无效createMatrix()
,在return
语句之后,它将永远不会被执行。
您释放了tab[i]
中NULL
元素,createMatrix()
位于您malloc
数组指针的循环内。{/ p>
你应该做的是
free(tab);
代替。
您永远不会return
malloc
编辑tab
。
您的fillMatrix()
函数不必使用int ***
三重指针,您不需要它,如果您通过指针直接修改数据。
fillMatrix()
*tab[i][a] = (a*i);
这并不代表您的想法,首先应用[]
,然后使用*
取消引用它,这相当于
*(tab[i][a]) = (a * i); -> *(tab[i][a]) -> tab[i][a][0]
你想要的是
(*tab)[i][a] = a * i;
打印后,您不必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;
}
答案 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);
}
}
}