将矩阵传递给函数后出现分段错误
Segmentation fault after passing a matrix to a function
我的程序需要检查输入矩阵是否为 magic square。
快完成了,但是我的功能有问题。我不确定为什么,但它 return 错误的值。我需要 return 1 的函数,如果方块是魔法的话,return 0 如果方块不是魔法的话。我收到奇怪的输出和分段错误。
输入示例:
3 - size of square, square:
8 1 6
3 5 7
4 9 2
输出示例
(函数 return 1 因为正方形很神奇)
屏幕上打印的是 Square is magic。
代码:
#include<stdio.h>
#include <stdlib.h>
int is_magic(int m[][size], size_t size)
{
int sum = 0;
for(size_t col = 0; col < size; col++)
{
sum += m[col];
}
for(size_t row = 1; row < size; row++)
{
int psum = 0;
for(size_t col = 0; col < size; col++)
{
psum += m[col + row * size];
}
if(psum != sum) return 0;
}
for(size_t col = 0; col < size; col++)
{
int psum = 0;
for(size_t row = 0; row < size; row++)
{
psum += m[col + row * size];
}
if(psum != sum) return 0;
}
return 1;
}
int main()
{
int size,row,column;
scanf("%d",&size);
int *matrix
matrix = (int**)malloc(size * sizeof(int*));
for (row = 0; row < size; row++)
matrix[row] = (int*)malloc(size * sizeof(int));
for (row = 0; row < size; row++)
for (column = 0; column < size; column++)
scanf("%d ", &matrix[row][column]);
if(is_magic(matrix, size))
{
printf("Magic square");
}
else
{
printf("Not magic square");
}
return 0;
}
尝试以下操作:
#include<stdio.h>
int is_magic(int **matrix,int size)
{
int sum, sum1, sum2;
int row, column = 0;
//For diagonal elements
sum = 0;
for (row = 0; row < size; row++)
{
for (column = 0; column < size; column++)
{
if (row == column)
sum = sum + matrix[row][column];
}
}
//For Rows
for (row = 0; row < size; row++)
{
sum1 = 0;
for (column = 0; column < size; column++)
{
sum1 = sum1 + matrix[row][column];
}
if (sum == sum1)
return 1;
else
{
return 0;
break;
}
}
//For Columns
for (row = 0; row < size; row++)
{
sum2 = 0;
for (column = 0; column < size; column++)
{
sum2 = sum2 + matrix[column][row];
}
if (sum == sum2)
return 1;
else
{
return 0;
break;
}
}
}
int main()
{
int size;
scanf("%d",&size);
int matrix[size][size];
int row=0, column = 0;
int flag = 0;
for (row = 0; row < size; row++)
{
for (column = 0; column < size; column++)
scanf("%d", &matrix[row][column]);
printf("%d\n", matrix[row][column]);
}
flag = is_magic(size,matrix);
if (flag == 1)
printf("1");
else
printf("0");
return 0;
}
is_magic
的调用应该是
flag = is_magic(matrix,size);
因为这与您的函数定义一致。
问题出在 is_magic 函数的签名上。你需要传入一个二维数组给它;
int is_magic(int **matrix,int size);
这里你传递了一个指向 int 指针的指针。
你需要传递一个二维数组如下:
int is_magic(int matrix[][size], int size);
确保使用 C99 兼容的编译器。
快速附注,您可能需要也可能不需要颠倒 is_magic 函数的参数顺序。
您实际上需要将参数的顺序颠倒如下,以符合参数的函数调用顺序。
int is_magic(int size, int matrix[][size]);
二维数组就是内存的连续缝隙。如果数组的列数和行数相同,则存储它们的顺序在这种情况下并不重要。
int is_magic(int *m, size_t size)
{
int sum = 0;
for(size_t col = 0; col < size; col++)
{
sum += m[col];
}
for(size_t row = 1; row < size; row++)
{
int psum = 0;
for(size_t col = 0; col < size; col++)
{
psum += m[col + row * size];
}
if(psum != sum) return 0;
}
for(size_t col = 0; col < size; col++)
{
int psum = 0;
for(size_t row = 0; row < size; row++)
{
psum += m[col + row * size];
}
if(psum != sum) return 0;
}
return 1;
}
int m[3][3] =
{
{8, 1, 6},
{3, 5, 7},
{4, 9, 2},
};
int m1[3][3] =
{
{8, 1, 6},
{3, 9, 7},
{4, 9, 2},
};
int main()
{
printf("%d\n", is_magic(m,3));
printf("%d\n", is_magic(m1,3));
return 0;
}
我的程序需要检查输入矩阵是否为 magic square。
快完成了,但是我的功能有问题。我不确定为什么,但它 return 错误的值。我需要 return 1 的函数,如果方块是魔法的话,return 0 如果方块不是魔法的话。我收到奇怪的输出和分段错误。
输入示例:
3 - size of square, square:
8 1 6
3 5 7
4 9 2
输出示例 (函数 return 1 因为正方形很神奇) 屏幕上打印的是 Square is magic。
代码:
#include<stdio.h>
#include <stdlib.h>
int is_magic(int m[][size], size_t size)
{
int sum = 0;
for(size_t col = 0; col < size; col++)
{
sum += m[col];
}
for(size_t row = 1; row < size; row++)
{
int psum = 0;
for(size_t col = 0; col < size; col++)
{
psum += m[col + row * size];
}
if(psum != sum) return 0;
}
for(size_t col = 0; col < size; col++)
{
int psum = 0;
for(size_t row = 0; row < size; row++)
{
psum += m[col + row * size];
}
if(psum != sum) return 0;
}
return 1;
}
int main()
{
int size,row,column;
scanf("%d",&size);
int *matrix
matrix = (int**)malloc(size * sizeof(int*));
for (row = 0; row < size; row++)
matrix[row] = (int*)malloc(size * sizeof(int));
for (row = 0; row < size; row++)
for (column = 0; column < size; column++)
scanf("%d ", &matrix[row][column]);
if(is_magic(matrix, size))
{
printf("Magic square");
}
else
{
printf("Not magic square");
}
return 0;
}
尝试以下操作:
#include<stdio.h>
int is_magic(int **matrix,int size)
{
int sum, sum1, sum2;
int row, column = 0;
//For diagonal elements
sum = 0;
for (row = 0; row < size; row++)
{
for (column = 0; column < size; column++)
{
if (row == column)
sum = sum + matrix[row][column];
}
}
//For Rows
for (row = 0; row < size; row++)
{
sum1 = 0;
for (column = 0; column < size; column++)
{
sum1 = sum1 + matrix[row][column];
}
if (sum == sum1)
return 1;
else
{
return 0;
break;
}
}
//For Columns
for (row = 0; row < size; row++)
{
sum2 = 0;
for (column = 0; column < size; column++)
{
sum2 = sum2 + matrix[column][row];
}
if (sum == sum2)
return 1;
else
{
return 0;
break;
}
}
}
int main()
{
int size;
scanf("%d",&size);
int matrix[size][size];
int row=0, column = 0;
int flag = 0;
for (row = 0; row < size; row++)
{
for (column = 0; column < size; column++)
scanf("%d", &matrix[row][column]);
printf("%d\n", matrix[row][column]);
}
flag = is_magic(size,matrix);
if (flag == 1)
printf("1");
else
printf("0");
return 0;
}
is_magic
的调用应该是
flag = is_magic(matrix,size);
因为这与您的函数定义一致。
问题出在 is_magic 函数的签名上。你需要传入一个二维数组给它;
int is_magic(int **matrix,int size);
这里你传递了一个指向 int 指针的指针。
你需要传递一个二维数组如下:
int is_magic(int matrix[][size], int size);
确保使用 C99 兼容的编译器。
快速附注,您可能需要也可能不需要颠倒 is_magic 函数的参数顺序。
您实际上需要将参数的顺序颠倒如下,以符合参数的函数调用顺序。
int is_magic(int size, int matrix[][size]);
二维数组就是内存的连续缝隙。如果数组的列数和行数相同,则存储它们的顺序在这种情况下并不重要。
int is_magic(int *m, size_t size)
{
int sum = 0;
for(size_t col = 0; col < size; col++)
{
sum += m[col];
}
for(size_t row = 1; row < size; row++)
{
int psum = 0;
for(size_t col = 0; col < size; col++)
{
psum += m[col + row * size];
}
if(psum != sum) return 0;
}
for(size_t col = 0; col < size; col++)
{
int psum = 0;
for(size_t row = 0; row < size; row++)
{
psum += m[col + row * size];
}
if(psum != sum) return 0;
}
return 1;
}
int m[3][3] =
{
{8, 1, 6},
{3, 5, 7},
{4, 9, 2},
};
int m1[3][3] =
{
{8, 1, 6},
{3, 9, 7},
{4, 9, 2},
};
int main()
{
printf("%d\n", is_magic(m,3));
printf("%d\n", is_magic(m1,3));
return 0;
}