我有一个带人的文本文件,可供三个人使用。 每个人的属性都用逗号分隔。 看起来像这样: 我最终要完成的工作是按照姓氏的升序对这些人进行排序。 不确定我是否在考虑正确的方法,但是我想创建一个2D数组,将每个属性分配给正确的行和列。 现在我们可以忘记排序了。 如何获得每一行来 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
#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 *吗?
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指针本身完成工作。
顺便说一句,您能告诉我为什么我必须在
***
中放入***
吗?
这是一个很好的问题。 顺便说一句,它提供了回答“为什么程序会崩溃”问题的关键。 程序崩溃的原因是您未正确使用矩阵:您将其视为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
。
你有几个问题
在createMatrix()
函数中的无意义的free(tab)
,它在return
语句之后,将永远不会执行。
你释放tab[i]
元件,其是NULL
在createMatrix()
您在循环内malloc
数组的指针。
你应该做的是
free(tab);
代替。
您永远不会return
malloc
ed 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;
}
您询问:
顺便说一句,您能告诉我为什么我必须在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);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.