C - 使用自由函数时程序崩溃
C - program crashes when using free function
首先,抱歉我的英语不好 jeje。我不会说。
我在使用 free() 函数释放内存时遇到问题,这是我遇到的问题:
我在 Windows 7 上使用代码块。我已经使用动态内存分配大约 3 年了,这是我第一次遇到这个问题。
有人说是gcc编译器的问题
函数内外的方向相同,所以我不认为我在尝试释放无效指针
代码中的错误是:
M == NULL
不是检查 malloc
是否成功的有效方法。您应该使用 (*M) == NULL
,因为该值分配给 (*M)
,而不是 M
。
ReservarMemoriaMatriz
i<=m
中的循环条件似乎有误。应该是 i<=n
.
- 您忘记在
LiberarMemoriaMatriz
中释放 (*M)[n]
。
更正后的代码:
void LiberarMemoriaMatriz(double*** M,int n){
int i = 0;
if(M == NULL) return;
for(i=0; i<=n; i++){
free((*M)[i]);
}
free(*M);
}
int ReservarMemoriaMatriz(double*** M, int n, int ,){
int i = 0;
if(M == NULL) return 0;
(*M) = malloc((n+1)*sizeof(double*));
if((*M) == NULL){
return 0;
}
for(i = 0; i<=n; i++){
(*M)[i] = malloc(m*sizeof(double));
if((*M)[i] == NULL){
/* free what is allocated before failing */
for(i--; i>=0; i--) free((*M)[i]);
free(*M);
return 0;
}
}
return 1;
}
你的 for 循环应该在你的第二轮分配中使用 n
而不是 m
。
for (i=0; i < n; i++) // You're using m here: use n
{
...
malloc(m...) // Here m is correct
我一行一行地找,终于找到了错误:
我喜欢你说的:
free what is allocated before failing
我更改的另一件事是在分配内存时使用:
(*M) = (double**)malloc(n * sizeof(double*));
和循环条件,i < n
,一切正常。
首先,抱歉我的英语不好 jeje。我不会说。
我在使用 free() 函数释放内存时遇到问题,这是我遇到的问题:
我在 Windows 7 上使用代码块。我已经使用动态内存分配大约 3 年了,这是我第一次遇到这个问题。 有人说是gcc编译器的问题
函数内外的方向相同,所以我不认为我在尝试释放无效指针
代码中的错误是:
M == NULL
不是检查malloc
是否成功的有效方法。您应该使用(*M) == NULL
,因为该值分配给(*M)
,而不是M
。ReservarMemoriaMatriz
i<=m
中的循环条件似乎有误。应该是i<=n
.- 您忘记在
LiberarMemoriaMatriz
中释放(*M)[n]
。
更正后的代码:
void LiberarMemoriaMatriz(double*** M,int n){
int i = 0;
if(M == NULL) return;
for(i=0; i<=n; i++){
free((*M)[i]);
}
free(*M);
}
int ReservarMemoriaMatriz(double*** M, int n, int ,){
int i = 0;
if(M == NULL) return 0;
(*M) = malloc((n+1)*sizeof(double*));
if((*M) == NULL){
return 0;
}
for(i = 0; i<=n; i++){
(*M)[i] = malloc(m*sizeof(double));
if((*M)[i] == NULL){
/* free what is allocated before failing */
for(i--; i>=0; i--) free((*M)[i]);
free(*M);
return 0;
}
}
return 1;
}
你的 for 循环应该在你的第二轮分配中使用 n
而不是 m
。
for (i=0; i < n; i++) // You're using m here: use n
{
...
malloc(m...) // Here m is correct
我一行一行地找,终于找到了错误:
我喜欢你说的:
free what is allocated before failing
我更改的另一件事是在分配内存时使用:
(*M) = (double**)malloc(n * sizeof(double*));
和循环条件,i < n
,一切正常。