在函数内更改矩阵并在 main 中使用它
change matrix inside a function and use it in main
我是 c 语言的新手,我有一个任务要在一个函数内分配一个动态矩阵,将值放入其中,然后 return 到 main,然后调用另一个打印矩阵的函数。我知道如果我想更改函数内的矩阵值,我需要使用“&”。但是当我 return 到 main 以打印矩阵时,我得到 "Segmentation fault (core dumped)"。
有人能告诉我我的代码有什么问题吗:
#include <stdio.h>
#include <stdlib.h>
int checkSize(int); //checking matrix size
void printMatrix(int **, int); //print matrix
int createMatrix(int ***, int); //allocate matrix and puts values from user.
int main()
{
int c; int **p=NULL;
printf("enter size of a matrix\n");
c=getchar();
if (checkSize(c))
{
if((createMatrix(&p, c-'0'))!=0)
printMatrix(p, c-'0');
}
return 0;
}
int checkSize(int c)
{
if (c>'9'||c<'0')
return 0;
return 1;
}
int createMatrix(int ***p, int n)
{
int m=n;
int k;
p=(int***)malloc(m*sizeof(int**));
for (k=0; k<m; k++)
p[k]=(int**)malloc(m*sizeof(int*));
printf("enter numbers\n");
int *l;
int i;
int c;
for (i=0; i<m; i++)
{
k=n;
for (l=(int*)(p)+i;k>0;l++)
{
c=getchar();
if (c==EOF)
{
printf("error EOF");
return 0;
}
if (c>'9'||c<'0')
{
printf("error");
return 0;
}
*l=c-'0';
k--;
}
}
return 1;
}
void printMatrix(int **p, int n)
{
int k=n;
int* l;
int i;
int m=n;
for (i=0; i<k; i++)
{
m=n;
printf("\n");
for (l=(int*)(p)+i;m>0;l++)
{
printf("%d ", *l);
m--;
}
}
}
一个问题是您的内存分配。您为错误的类型分配了 space 并错误地保存了结果。即
p=(int***)malloc(m*sizeof(int**));
应该是
*p = malloc(m * sizeof(int*));
和
p[k]=(int**)malloc(m*sizeof(int*));
应该是
(*p)[k] = malloc(m * sizeof(int));
这是一种不直接对输入参数进行操作的替代方法:
#include <stdio.h>
#include <stdlib.h>
int create(int ***m, int n)
{
int i, j;
// Create the matrix
int** p = malloc(n * sizeof *p); // ToDo: Check return value
for (i=0; i < n; ++i)
{
p[i] = malloc(n * sizeof **p); // ToDo: Check return value
}
for (i=0; i < n; ++i)
{
for (j=0; j < n; ++j)
{
*(p[i] + j) = 10 * i + j;
}
}
// Assign the matrix to the passed pointer
*m = p;
return 0;
}
void pm(int **m, int n)
{
int i, j;
for (i=0; i < n; ++i)
{
for (j=0; j < n; ++j)
{
printf("%d ", *(m[i] + j));
}
printf("\n");
}
}
int main(void) {
int** m;
create(&m, 5);
pm(m, 5);
// ToDo: Add code to free memory
return 0;
}
输出:
0 1 2 3 4
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
40 41 42 43 44
注意 为了清晰检查 malloc
return 值被省略。
我是 c 语言的新手,我有一个任务要在一个函数内分配一个动态矩阵,将值放入其中,然后 return 到 main,然后调用另一个打印矩阵的函数。我知道如果我想更改函数内的矩阵值,我需要使用“&”。但是当我 return 到 main 以打印矩阵时,我得到 "Segmentation fault (core dumped)"。 有人能告诉我我的代码有什么问题吗:
#include <stdio.h>
#include <stdlib.h>
int checkSize(int); //checking matrix size
void printMatrix(int **, int); //print matrix
int createMatrix(int ***, int); //allocate matrix and puts values from user.
int main()
{
int c; int **p=NULL;
printf("enter size of a matrix\n");
c=getchar();
if (checkSize(c))
{
if((createMatrix(&p, c-'0'))!=0)
printMatrix(p, c-'0');
}
return 0;
}
int checkSize(int c)
{
if (c>'9'||c<'0')
return 0;
return 1;
}
int createMatrix(int ***p, int n)
{
int m=n;
int k;
p=(int***)malloc(m*sizeof(int**));
for (k=0; k<m; k++)
p[k]=(int**)malloc(m*sizeof(int*));
printf("enter numbers\n");
int *l;
int i;
int c;
for (i=0; i<m; i++)
{
k=n;
for (l=(int*)(p)+i;k>0;l++)
{
c=getchar();
if (c==EOF)
{
printf("error EOF");
return 0;
}
if (c>'9'||c<'0')
{
printf("error");
return 0;
}
*l=c-'0';
k--;
}
}
return 1;
}
void printMatrix(int **p, int n)
{
int k=n;
int* l;
int i;
int m=n;
for (i=0; i<k; i++)
{
m=n;
printf("\n");
for (l=(int*)(p)+i;m>0;l++)
{
printf("%d ", *l);
m--;
}
}
}
一个问题是您的内存分配。您为错误的类型分配了 space 并错误地保存了结果。即
p=(int***)malloc(m*sizeof(int**));
应该是
*p = malloc(m * sizeof(int*));
和
p[k]=(int**)malloc(m*sizeof(int*));
应该是
(*p)[k] = malloc(m * sizeof(int));
这是一种不直接对输入参数进行操作的替代方法:
#include <stdio.h>
#include <stdlib.h>
int create(int ***m, int n)
{
int i, j;
// Create the matrix
int** p = malloc(n * sizeof *p); // ToDo: Check return value
for (i=0; i < n; ++i)
{
p[i] = malloc(n * sizeof **p); // ToDo: Check return value
}
for (i=0; i < n; ++i)
{
for (j=0; j < n; ++j)
{
*(p[i] + j) = 10 * i + j;
}
}
// Assign the matrix to the passed pointer
*m = p;
return 0;
}
void pm(int **m, int n)
{
int i, j;
for (i=0; i < n; ++i)
{
for (j=0; j < n; ++j)
{
printf("%d ", *(m[i] + j));
}
printf("\n");
}
}
int main(void) {
int** m;
create(&m, 5);
pm(m, 5);
// ToDo: Add code to free memory
return 0;
}
输出:
0 1 2 3 4
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
40 41 42 43 44
注意 为了清晰检查 malloc
return 值被省略。