0

我正在使用代码::块。

在 dealloc_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);
}
4

3 回答 3

1

这是错误:

_mat[i] = &tmpMatrix[i];

应该

_mat[i] = &tmpMatrix[0];

或更好

_mat[i] = tmpMatrix;
于 2013-10-22T19:11:53.767 回答
1

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

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

应该是这样的:

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

此外,_mat_lines_columnsC 中的保留标识符,您不应该使用它们。_mat在普通 (ie ) 或标记 (ie ) 命名空间中以文件范围的下划线开头的任何标识符struct _mat都被保留。

于 2013-10-22T19:13:14.360 回答
0

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

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);  
}

以下是如何为 ints 修改(和使用)上述内容:(注意,它实际上只是识别 中的差异sizeof(type)
另请注意: usingmalloc()不会初始化值。如果要保证每个元素的初始值(例如0),则可以calloc()改用。

void allocMemoryInt(int rows, int cols);
void freeMemoryInt(int numStrings);
int **array;

int main(void)
{
    allocMemoryInt(10, 3);
    freeMemoryInt(10);
    return 0;   
}

void allocMemoryInt(int rows, int cols)
{
    int i;
    array = malloc(sizeof(int *)*(rows));  //create memory for row pointers
    for(i=0;i<rows; i++) 
      array[i] = malloc(sizeof(int)*cols + 1);  //create memory for (row * col) elements
}

void freeMemoryInt(int rows)
{
    int i;
    for(i=0;i<rows; i++)  
        if(array[i]) free(array[i]);//call free for each row 
    free(array);  //free pointer array(will clean up everything allocated)
}
于 2013-10-22T19:11:43.187 回答