我正在尝试通过引用接收矩阵,并将元素添加到另一个互补矩阵中。也就是说,我的方法将收到3个参数:矩阵,一行和一列。
当我填写新矩阵时,我不能拿走收到的行和列。 好吧,我在使用这种方法时遇到了麻烦:
int **matrizComplementar(int **matOriginal, int linha, int coluna){
int y = 0;
int k = 0;
// Aloca espaço para matriz complementar
int ** matCompl = retornarMatrizQuadrada(N-1);
for(int i = 0; i < N; i++){
if(i != linha){
for(int j = 0; j < N; j++){
if(j != coluna)
{
matCompl[y][k] = matOriginal[i][j]; <<< When i read or write
I get "Sigment Default"
k++;
}
}
y++;
}
k = 0;
}
return matCompl;
}
完整代码如下。
int ** preecherMatriz(int ** mat){
// Preenche a matriz inicial
for( int k = 0; k < N; k++ ){
for( int l = 0; l < N; l++ ){
printf("Entre com o Valor [%d][%d]: ", k ,l );
scanf("%d", &mat[k][l]);
}
}
}
int ** retornarMatrizQuadrada(int tamN){
// Aloca matriz de tamanho N
int ** mat;
mat = (int **)malloc((tamN)*sizeof(int*));
for (int i=0; i<tamN; i++)
mat[i] = (int *)malloc((tamN)*sizeof(int));
return mat;
}
void imprimirMatriz(int ** m){
// Mostra ao usuário
printf("\nMatriz complementar:\n");
for( int k = 0; k < N-1; k++ ){
for( int l = 0; l < N-1; l++ )
printf("%d ", &m[k][l]);
printf("\n");
system("pause");
}
}
int ** matrizComplementar(int **matOriginal, int linha, int coluna){
int y = 0;
int k = 0;
// Aloca espaço para matriz complementar
int ** matCompl = retornarMatrizQuadrada(N-1);
for(int i = 0; i < N; i++){
if(i != linha){
for(int j = 0; j < N; j++){
if(j != coluna)
{
matCompl[y][k] = matOriginal[i][j];
k++;
}
}
y++;
}
k = 0;
}
return matCompl;
}
int main(void) {
imprimirMatriz(matrizComplementar(preecherMatriz(retornarMatrizQuadrada(N)), 1,2));
}
答案 0 :(得分:0)
如comments中所述:
我的编译器告诉我,您没有从
preecherMatriz()
返回值,这很可悲,因为您在调用matrizComplementar()
时使用了该值-这可能是程序崩溃的原因。一行中的4个函数调用令人恐惧。我不会写这样的代码,尤其是涉及内存分配的地方。您的printf()
还会打印数组元素的地址(不正确):您应该放下&
。不喜欢调用多个函数的原因之一-您无法跟踪分配的内存,因此无法释放它。这里可能没关系;在大多数程序中都是如此。
这是一个紧密基于您的代码的MCVE,该MCVE不会崩溃,并且可以产生我期望的结果:
#include <stdio.h>
#include <stdlib.h>
#define N 5
static int **preecherMatriz(int **mat)
{
for (int k = 0; k < N; k++)
{
for (int l = 0; l < N; l++)
{
printf("Entre com o Valor [%d][%d]: ", k, l);
scanf("%d", &mat[k][l]);
}
}
return mat;
}
static int **retornarMatrizQuadrada(int tamN)
{
int **mat;
mat = (int **)malloc((tamN) * sizeof(int *));
for (int i = 0; i < tamN; i++)
mat[i] = (int *)malloc((tamN) * sizeof(int));
return mat;
}
static void imprimirMatriz(int **m)
{
printf("\nMatriz complementar:\n");
for (int k = 0; k < N - 1; k++)
{
for (int l = 0; l < N - 1; l++)
printf(" %3d", m[k][l]);
printf("\n");
}
}
static int **matrizComplementar(int **matOriginal, int linha, int coluna)
{
int y = 0;
int k = 0;
int **matCompl = retornarMatrizQuadrada(N - 1);
for (int i = 0; i < N; i++)
{
if (i != linha)
{
for (int j = 0; j < N; j++)
{
if (j != coluna)
{
matCompl[y][k] = matOriginal[i][j];
k++;
}
}
y++;
}
k = 0;
}
return matCompl;
}
int main(void)
{
imprimirMatriz(matrizComplementar(preecherMatriz(retornarMatrizQuadrada(N)), 1, 2));
}
唯一的变化是使函数static
(摆脱我极为繁琐的编译器选项),加上额外的return
和已删除的&
,然后我删除了{{1 }}中的矩阵打印功能。我没有添加检查内存分配失败的方法-应该这样做,但我没有这样做。
示例输出(程序名称system("pause");
):
mtx29
因此,您的代码已经接近工作了,但是您要么忽略了编译器警告(不要!),要么您的编译器没有提供您需要的所有帮助-了解如何提高警告级别。 / p>
所示的代码($ mtx29
Entre com o Valor [0][0]: 100
Entre com o Valor [0][1]: 101
Entre com o Valor [0][2]: 102
Entre com o Valor [0][3]: 103
Entre com o Valor [0][4]: 104
Entre com o Valor [1][0]: 210
Entre com o Valor [1][1]: 211
Entre com o Valor [1][2]: 212
Entre com o Valor [1][3]: 213
Entre com o Valor [1][4]: 214
Entre com o Valor [2][0]: 320
Entre com o Valor [2][1]: 321
Entre com o Valor [2][2]: 322
Entre com o Valor [2][3]: 323
Entre com o Valor [2][4]: 324
Entre com o Valor [3][0]: 498
Entre com o Valor [3][1]: 497
Entre com o Valor [3][2]: 476
Entre com o Valor [3][3]: 465
Entre com o Valor [3][4]: 454
Entre com o Valor [4][0]: 511
Entre com o Valor [4][1]: 522
Entre com o Valor [4][2]: 533
Entre com o Valor [4][3]: 544
Entre com o Valor [4][4]: 555
Matriz complementar:
100 101 103 104
320 321 323 324
498 497 465 454
511 522 544 555
$
)使用GCC 8.1.0和命令行在运行macOS High Sierra 10.13.6的Mac上干净地编译:
mtx29.c