C

时间:2016-01-06 21:28:59

标签: c allocation calloc

我在尝试制作一个使用高斯消元法求解线性系统的程序时偶然发现了这个问题。我很抱歉代码的这一部分,但我真的需要帮助,我认为这样你就可以看出我是否犯了一些我忽略的错误。

本程序完美无缺,直到我试着命名我的b矩阵或c矩阵"解决方案"而且我偶然发现了这个因为每个其他名字一切正常。 此外,如果我运行调试器,即使给出名称解决方案,也不会发生此故障 当我以此输入为例时: Coeff矩阵行:4 Coeff矩阵列:4 Coeff矩阵名称:测试

卢比。矩阵行:4 卢比。矩阵列:1 卢比。矩阵名称:Rs

溶胶。矩阵行: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;

}

1 个答案:

答案 0 :(得分:1)

永远不会为nul终结符分配空间。每个需要n个字节+ 1,对于标记字符串结尾的特殊字符,此

const char example[] = "example"

相当于

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

您也经常使用calloc(),但除了将每个字节初始化为calloc()之外,您不需要使用0,为字符串分配空间,您可以执行此操作< / p>

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