我编写了此代码,并且在对所有错误和警告进行调试后,它似乎是编译的,但它显示了"分段故障(核心倾倒)",我不知道为什么这样做。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int nrig, ncol;
unsigned int **mat;
} matrice, *pmatrice;
void mat_alloca (pmatrice m)
{
m->mat = malloc(m->nrig * sizeof(*m->mat));
if (m->mat == NULL) {
perror(__func__);
exit(1);
}
m->mat[0] = calloc(m->nrig * m->ncol, sizeof(**m->mat));
if (m->mat[0] == NULL) {
perror(__func__);
exit(1);
}
}
void mat_stampa (pmatrice mat, FILE* f)
{
int i, j;
fprintf(f, "%d %dn", mat->ncol, mat->nrig);
for (i=0; i<mat->nrig; i++){
for(j=0; j<mat->ncol; i++){
fprintf(f, "%2d ", mat->mat[i][j]);
}
fprintf(f,"n");
}
fprintf(f, "n");
}
void mat_leggi (pmatrice mat, FILE *f)
{
int i, j;
if (fscanf(f, "%d %d", &mat->ncol, &mat->nrig)!=2) {
fprintf(stderr, "%s:intestazione file non corretta!n", __func__);
exit(1);
}
mat_alloca(mat);
for(i=0; i<mat->nrig;i++){
for(j=0;j<mat->ncol;j++){
fscanf(f, "%ud ", &mat->mat[i][j]);
}
}
}
void mat_leggi_da_file(pmatrice mat, char *fn)
{
FILE *f = fopen(fn, "r");
if(!f){
perror(fn);
exit(1);
}
mat_leggi(mat,f);
}
void mat_stampa_su_file(pmatrice mat, char *fn)
{
FILE *f = fopen(fn, "w");
if(!f){
perror(fn);
exit(1);
}
mat_stampa(mat,f);
}
double media(pmatrice mat)
{
int i,j,somma=0;
int max=0,min=100;
for(i=0;i<mat->nrig;i++){
for(j=0;j<mat->ncol;j++){
int val = mat->mat[i][j];
if(val>max){
max=val;
} else if(val<min){
min=val;
}
somma += val;
}
}
return (somma - max - min)/(double) (mat->nrig * mat->ncol -2);
}
int cmp(int *a1, int *a2, int l)
{
for(;l>0;l--,a1++,a2++){
if(*a1>*a2) return -1;
if(*a2>*a1) return 1;
}
return 0;
}
void mat_bubblesort (pmatrice mat)
{
unsigned int **m = mat->mat;
int i,j,k;
for (j=mat->nrig-1;j>0; j=k) {
k=-1;
for(i=0;i<j;i++){
if(cmp(m[i],m[i+1],mat->ncol)>0) {
typeof(*m) tmp = m[i];
m[i]=m[i+1];
m[i+1]=tmp;
k=i;
}
}
}
}
int main(int argc, char *argv[])
{
matrice mat;
if (argc>1) {
mat_leggi_da_file(&mat, argv[1]);
} else {
mat_leggi_da_file(&mat, "matrice.txt");
}
mat_stampa(&mat,stdout);
printf("n il valore medio e' %fn", media(&mat));
mat_bubblesort(&mat);
if (argc>2){
mat_stampa_su_file(&mat, argv[2]);
} else {
mat_stampa(&mat, stdout);
}
return 0;
}
第一期,您正在为mat
缓冲区分配1个大型缓冲区,但是,您像2D数组一样访问它(行X Col Matrix)。修复分配尝试以下方法:
void mat_alloca (pmatrice m)
{
m->mat = malloc(m->nrig * sizeof(*m->mat));
if (m->mat == NULL) {
perror(__func__);
exit(1);
}
// problem here: m->mat[0] = calloc(m->nrig * m->ncol, sizeof(**m->mat));
int r;
for (r = 0; r < m->nrig; r++) {
m->mat[r] = malloc(m->ncol * sizeof(int));
if (m->mat[r] == NULL) {
perror(__func__);
exit(1);
}
}
}
另一个问题是mat_stampa
函数中的此错字,数组索引不限制为segfault:
void mat_stampa (pmatrice mat, FILE* f)
{
int i, j;
fprintf(f, "%d %dn", mat->ncol, mat->nrig);
for (i=0; i<mat->nrig; i++){
for(j=0; j<mat->ncol; i++){ // <=== here, should be j++ !!!
fprintf(f, "%2d ", mat->mat[i][j]);
}
fprintf(f,"n");
}
fprintf(f, "n");
}
"分割故障"意味着您尝试访问无法访问的内存。
有四个常见的错误导致分割错误:取消定位无效,取消了一个非初始化的指针,取消了已释放(或在C 中删除的指针),或者在宣布的范围内(在阵列中都消失了)在函数中),并将阵列结束。