2016-01-06 27 views
0

我在这个问题跌跌撞撞地试图使该解决使用高斯消元equasions的线性系统中PROGRAMM。我很抱歉代码的很长一段时间,但我真的需要帮助,我认为这样你可以看到我是否犯了一些我忽略的错误。分配故障(函数或代码)和奇怪的行为用C

此程序运行完美,直到我试图来命名我的矩阵B或C矩阵“解决方案”和我不期而遇发现了这一点,因为与所有其他名称一切正常就好了。 Coeff进行矩阵行:4 Coeff进行矩阵列:4 Coeff进行矩阵名:测试

卢比 另外,如果我运行调试器即使得到名称溶液 当我给这个输入例如不会发生此failuer 。矩阵行:4 卢比。矩阵列:1 卢比。矩阵名称:Rs

Sol。矩阵行:4 溶胶。矩阵列:1 溶胶。矩阵名称:解决方案

程序崩溃。 同样的事情发生,如果我给我的Rs(b)矩阵的名称解决方案。

真的很奇怪,如果我命名我的第一个矩阵解决方案,就不会发生这种情况。另外我在我的代码中只分配了一个矩阵,并且该矩阵也可以被命名为解决方案。

更奇怪的是,当这些错误发生时,有时但只是有时我的程序会在崩溃之前打印消息无法为矩阵行分配内存。我的输入保持总是相同的 我也尝试将calloc更改为malloc等。

在此先感谢!

typedef struct matrix_s //This is the structure 
{ 
char *name; 
double **element; 
long columns; 
long rows; 
}matrix_t; 

matrix_t *matrix_allocate(long columns, long rows, char *name)//This is my function that fails 
{ 
if(rows<=0 || columns<=0) 
{ 
    fprintf(stderr,"Number of rows/columns is not valid\n"); 
    return 0; 
} 

matrix_t *mymatrix=calloc(1,sizeof(matrix_t)); 

long i; 

if(!mymatrix) 
{ 
    fprintf(stderr,"Failed to allocate memory for matrix\n"); 
    return 0; 
} 

mymatrix->name=calloc(strlen(name),sizeof(char)); 

if(!mymatrix->name) 
{ 
    fprintf(stderr,"Failed to allocate memory for the name of matrix\n"); 
    free(mymatrix); 
    mymatrix=0; 
    return 0; 
} 

strcpy(mymatrix->name,name); 


mymatrix->element=calloc(rows,sizeof(double *)); 


if(!mymatrix->element) 
{ 
    fprintf(stderr,"Failed to allocate memory for matrix rows\n"); 
    free(mymatrix->name); 
    mymatrix->name=0; 
    free(mymatrix); 
    mymatrix=0; 
    return 0; 
} 

for(i=0;i<rows;i++) 
{ 
    mymatrix->element[i]=calloc(columns,sizeof(double)); 

    if(!mymatrix->element[0]) 
    { 
     fprintf(stderr,"Failed to allocate columns for the first row\n"); 
     free(mymatrix->name); 
     mymatrix->name=0; 
     free(mymatrix->element); 
     mymatrix->element=0; 
     free(mymatrix); 
     mymatrix=0; 
     return 0; 
    } 

    if(!mymatrix->element[i])  { 
     fprintf(stderr,"Failed to allocate columns for the row  w  number:%ld\n",i); 
     for(i=i-1;i>=0;i--) 
     { 
      free(mymatrix->element[i]); 
      mymatrix->element[i]=0; 
     } 
     free(mymatrix->name); 
     mymatrix->name=0; 
     free(mymatrix->element); 
     mymatrix->element=0; 
     free(mymatrix); 
     mymatrix=0; 
     return 0; 

    } 


} 

mymatrix->columns=columns; 
mymatrix->rows=rows; 

return mymatrix; 
} 


int main()//Short version of the main programm 
{ 
    matrix_t *a=0, *b=0, *c=0; 
    char matrixname[50]; 
    long rows,cols; 

    ... 

    case 5: 
         clearbuff();//while(getchar()!='\n') 
      printf("Coeff. matrix rows:"); 
      scanf("%ld",&row); 
      clearbuff(); 
      printf("Coeff. matrix columns:"); 
      scanf("%ld",&cols); 
      clearbuff(); 
      printf("Coeff. matrix name:"); 
      fgets(matrixname,49,stdin); 
      *strrchr(matrixname,'\n')=0; 
      a=matrix_allocate(cols,row,matrixname); 

      clearbuff(); 
      printf("Rs. matrix rows:"); 
      scanf("%ld",&row); 
      clearbuff(); 
      printf("Rs. matrix columns:"); 
      scanf("%ld",&cols); 
      clearbuff(); 
      printf("Rs. matrix name:"); 
      fgets(matrixname,49,stdin); 
      *strrchr(matrixname,'\n')=0; 
      b=matrix_allocate(cols,row,matrixname); 

      clearbuff(); 
      printf("Sol. matrix rows:"); 
      scanf("%ld",&row); 
      clearbuff(); 
      printf("Sol. matrix columns:"); 
      scanf("%ld",&cols); 
      clearbuff(); 
      printf("Sol. matrix name:"); 
      fgets(matrixname,49,stdin); 
      *strrchr(matrixname,'\n')=0; 
      c=matrix_allocate(cols,row,matrixname); 
      clearbuff(): 
      .... 
      .... 
      break; 

}

+2

提供最小的产生错误的代码 – rootkea

回答

1

你永远不分配为nul终止空间。每个需要n字节+ 1,该标记字符串的结尾的特殊字符,这

const char example[] = "example" 

相当于

const char example[] = {'e', 'x', 'a', 'm', 'p', 'l', 'e' ,'\0'}; 

您还可以使用calloc()了很多,但你不知道需要使用calloc()除了每个字节初始化为0,为字符串分配空间,你可以做到这一点

char *copy; 
size_t length; 
length = strlen(original); // Only call `strlen()' once please 
copy = malloc(length + 1); 
if (copy == NULL) 
    handle_error_and_stop_here(); 
memcpy(copy, original, length + 1); 
//       ^copy the `nul' too 

并有一个功能,这是否对你来说,只是

copy = strdup(original); 

还检查NULL,因为它会在失败时返回NULL

+0

真的,谢谢你,我现在已经开了近3个小时了。我不知道我是如何错过的。分配strlen()+ 1是有用的。谢谢:) – refa

+0

建议:使用[valgrind](www.valgrind.org)检查内存的正确使用情况。 –