名为 "cell" 的结构的免费二维数组(矩阵),其中每个数组都是字符串(char*)的成员
free 2d array(matrix) of struct named "cell" where each of them as member of string(char*)
分配:
cell **initBoard(int boardSize)
{
int i, j, k;
cell **matrix;
matrix = (cell **) malloc((boardSize + 1) * sizeof(cell *));
// init upper frame
matrix[0] = (cell *) malloc((boardSize + 1) * sizeof(cell));
matrix[0][0].type = (char *) malloc(3 * sizeof(char));
matrix[0][0].type[0] = ' ';
for (k = 1; k <= boardSize; k++)
{
// +1 for null char ?
matrix[0][k].type = (char *) malloc(3 * sizeof(char));
matrix[0][k].type = arrNo[k - 1];
}
// init inner rows
for (i = 1; i <= boardSize; i++)
{
matrix[i] = (cell *) malloc((boardSize + 1) * sizeof(cell));
// first letter each row
matrix[i][0].type = (char *) malloc(3 * sizeof(char));
matrix[i][0].type[0] = (char) (BASE_ALPHABET + i);
// init cols
for (j = 1; j <= boardSize; j++)
{
matrix[i][j].type = (char *) malloc(2 * sizeof(char) + 1);
matrix[i][j].type[0] = EMPTY;
matrix[i][j].type[1] = WATER; // default status
matrix[i][j].hidesShip = NULL;
}
}
return matrix;
}
取消分配:
void freeMatrix(cell **matrix, int boardSize)
{
int k, l;
for (k = 0; k <= boardSize; k++)
{
for (l = 0; l <= boardSize; l++)
{
free(matrix[k][l].type);
}
free(matrix[k]);
}
free(matrix);
}
我 运行 上面的代码(显示了 malloc + free)然后用 Valgrind 检查内存泄漏并得到这个输出:
Valdrind Log
知道我在这里做错了什么吗? Valgrind 意味着我做了一个额外的免费命令?我看不到确切的位置,因为我移动了所有单元格。也许这里需要更好地理解指针?谢谢。
matrix[0][k].type = (char *) malloc(3 * sizeof(char));
matrix[0][k].type = arrNo[k - 1];
问题是您正在分配内存,并且在写入保存地址的指针后立即分配内存。您无法再访问该内存,因此 valgrind 将其报告为泄漏。
你可能想写
matrix[0][k].type[0] = arrNo[k - 1];
假设 arrNo
是字符数组,第一个赋值将是非法的,因为您将 char
赋给 char *
。你的编译器应该给你一个警告。
分配:
cell **initBoard(int boardSize)
{
int i, j, k;
cell **matrix;
matrix = (cell **) malloc((boardSize + 1) * sizeof(cell *));
// init upper frame
matrix[0] = (cell *) malloc((boardSize + 1) * sizeof(cell));
matrix[0][0].type = (char *) malloc(3 * sizeof(char));
matrix[0][0].type[0] = ' ';
for (k = 1; k <= boardSize; k++)
{
// +1 for null char ?
matrix[0][k].type = (char *) malloc(3 * sizeof(char));
matrix[0][k].type = arrNo[k - 1];
}
// init inner rows
for (i = 1; i <= boardSize; i++)
{
matrix[i] = (cell *) malloc((boardSize + 1) * sizeof(cell));
// first letter each row
matrix[i][0].type = (char *) malloc(3 * sizeof(char));
matrix[i][0].type[0] = (char) (BASE_ALPHABET + i);
// init cols
for (j = 1; j <= boardSize; j++)
{
matrix[i][j].type = (char *) malloc(2 * sizeof(char) + 1);
matrix[i][j].type[0] = EMPTY;
matrix[i][j].type[1] = WATER; // default status
matrix[i][j].hidesShip = NULL;
}
}
return matrix;
}
取消分配:
void freeMatrix(cell **matrix, int boardSize)
{
int k, l;
for (k = 0; k <= boardSize; k++)
{
for (l = 0; l <= boardSize; l++)
{
free(matrix[k][l].type);
}
free(matrix[k]);
}
free(matrix);
}
我 运行 上面的代码(显示了 malloc + free)然后用 Valgrind 检查内存泄漏并得到这个输出:
Valdrind Log 知道我在这里做错了什么吗? Valgrind 意味着我做了一个额外的免费命令?我看不到确切的位置,因为我移动了所有单元格。也许这里需要更好地理解指针?谢谢。
matrix[0][k].type = (char *) malloc(3 * sizeof(char));
matrix[0][k].type = arrNo[k - 1];
问题是您正在分配内存,并且在写入保存地址的指针后立即分配内存。您无法再访问该内存,因此 valgrind 将其报告为泄漏。
你可能想写
matrix[0][k].type[0] = arrNo[k - 1];
假设 arrNo
是字符数组,第一个赋值将是非法的,因为您将 char
赋给 char *
。你的编译器应该给你一个警告。