Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 释放矩阵时出现分段错误_C - Fatal编程技术网

C 释放矩阵时出现分段错误

C 释放矩阵时出现分段错误,c,C,我正在使用代码::块 在Dealoc_mat中2-3次迭代后释放矩阵时,代码发送seg故障 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int **_mat; int _lines, _columns; void alloc_mat(); void dealloc_mat(); int main(int argc, char

我正在使用代码::块

在Dealoc_mat中2-3次迭代后释放矩阵时,代码发送seg故障

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>


int **_mat;
int _lines, _columns;


void alloc_mat();
void dealloc_mat();

int main(int argc, char *argv[])
{
    _lines = 31, _columns = 22;

    alloc_mat();
    dealloc_mat();

    return 0;
}

void alloc_mat()
{
    int i, row, col;
    _mat = malloc(sizeof(int *) * _lines);

    for(i = 0 ; i < _lines ; i++)
    {
        int *tmpMatrix = malloc(sizeof(int) * _columns);
        _mat[i] = &tmpMatrix[i];
    }

    for(row = 0 ; row < _lines ; row++)
    {
        for(col = 0 ; col < _columns ; col++)
        {
            _mat[row][col] = 0;
        }
    }
}

void dealloc_mat()
{
    int row;

    for(row = 0; row < _lines; row++)
    {
        free(_mat[row]);
    }

    free(_mat);
}
#包括
#包括
#包括
#包括
国际**;
整数行、整数列;
void alloc_mat();
void dealoc_mat();
int main(int argc,char*argv[])
{
_行=31,列=22;
alloc_mat();
dealoc_mat();
返回0;
}
void alloc_mat()
{
int i,行,列;
_mat=malloc(sizeof(int*)*行);
对于(i=0;i<\u行;i++)
{
int*tmpMatrix=malloc(sizeof(int)*\u列);
_mat[i]=&tmpMatrix[i];
}
对于(行=0;行<_行;行++)
{
用于(列=0;列<_列;列++)
{
_mat[行][col]=0;
}
}
}
void dealoc_mat()
{
int行;
对于(行=0;行<_行;行++)
{
自由(_mat[行]);
}
免费(_-mat);
}

这里有两个函数,用于为字符串、字符串数组分配内存。实际上,您可以根据自己的需要轻松修改它们:

char **strings; // created with global scope (before main())   
void allocMemory(int numStrings, int max)
{
    int i;
    strings = malloc(sizeof(char*)*(numStrings+1));
    for(i=0;i<numStrings; i++) 
      strings[i] = malloc(sizeof(char)*max + 1);  
}

void freeMemory(int numStrings)
{
    int i;
    for(i=0;i<numStrings; i++)
        if(strings[i]) free(strings[i]);
    free(strings);  
}
以下是错误:

_mat[i] = &tmpMatrix[i];
应该是

_mat[i] = &tmpMatrix[0];
或者更好

_mat[i] = tmpMatrix;

问题是您没有正确分配它。这:

for(i = 0 ; i < _lines ; i++)
    {
        int *tmpMatrix = malloc(sizeof(int) * _columns);
        _mat[i] = &tmpMatrix[i];
    }
for(i=0;i<\u行;i++)
{
int*tmpMatrix=malloc(sizeof(int)*\u列);
_mat[i]=&tmpMatrix[i];
}
应该是这样的:

for(i = 0 ; i < _lines ; i++)
    {
        _mat[i] = malloc(sizeof(int) * _columns);
    }
for(i=0;i<\u行;i++)
{
_mat[i]=malloc(sizeof(int)*\u列);
}

此外,
\u mat
\u行
\u列
是C语言中的保留标识符,您不应该使用它们。在普通(即
\u-mat
名称空间)或标记(即
struct\u-mat
)名称空间中,以下划线开头的任何标识符都是保留的

TMP矩阵在哪里定义?此代码不应编译或编辑。复制了错误的样本。保留对\u的评论+1
for(i = 0 ; i < _lines ; i++)
    {
        _mat[i] = malloc(sizeof(int) * _columns);
    }