你好!编写了一个从二维数组中删除字符串的程序。一切似乎都正常工作,但 valgrind 显示内存丢失和错误。请告诉我我做错了什么。
#include "cdio.h"
#include "func.h"
int del(long int **matrix, size_t *n, int pos)
{
free(matrix[pos]);
for (size_t i = pos; i < *n-1; i++)
matrix[i] = matrix[i+1];
*n -= 1;
long int **temp = realloc(matrix, *n * sizeof(long int *));
if (temp)
{
matrix = temp;
temp = NULL;
}
return SUCCESS;
}
int main()
{
long int **matrix = NULL;
size_t n = 5;
size_t m = 4;
matrix = matrix_allocate(n, m);
for (size_t i = 0; i < n; i++)
for (size_t j = 0; j < m; j++)
matrix[i][j] = rand() % 100;
puts("OLD MATRIX:");
print_matrix(matrix, n, m);
int pos = 0;
puts("enter position:");
scanf("%d", &pos);
del(matrix, &n, pos);
puts("NEW MATRIX:");
print_matrix(matrix, n, m);
for (int i = 0; i < n; i++)
free(matrix[i]);
free(matrix);
return 0;
}
OLD MATRIX:
83 86 77 15
93 35 86 92
49 21 62 27
90 59 63 26
40 26 72 36
enter position:
1
NEW MATRIX:
==3691== Invalid read of size 8
==3691== at 0x108E30: print_matrix (cdio.c:60)
==3691== by 0x108B86: main (del.c:47)
==3691== Address 0x522d040 is 0 bytes inside a block of size 40 free'd
==3691== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3691== by 0x108A1C: del (del.c:12)
==3691== by 0x108B63: main (del.c:43)
==3691== Block was alloc'd at
==3691== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3691== by 0x108C11: matrix_allocate (cdio.c:8)
==3691== by 0x108A80: main (del.c:29)
==3691==
83 86 77 15
49 21 62 27
90 59 63 26
40 26 72 36
==3741== Invalid read of size 8
==3741== at 0x108BA4: main (del.c:50)
==3741== Address 0x522d040 is 0 bytes inside a block of size 40 free'd
==3741== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3741== by 0x108A1C: del (del.c:12)
==3741== by 0x108B63: main (del.c:43)
==3741== Block was alloc'd at
==3741== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3741== by 0x108C11: matrix_allocate (cdio.c:8)
==3741== by 0x108A80: main (del.c:29)
==3741==
==3741== Invalid free() / delete / delete[] / realloc()
==3741== at 0x4C30D3B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3741== by 0x108BCD: main (del.c:52)
==3741== Address 0x522d040 is 0 bytes inside a block of size 40 free'd
==3741== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3741== by 0x108A1C: del (del.c:12)
==3741== by 0x108B63: main (del.c:43)
==3741== Block was alloc'd at
==3741== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3741== by 0x108C11: matrix_allocate (cdio.c:8)
==3741== by 0x108A80: main (del.c:29)
参数
matrix
是函数中的局部变量del
。matrix
函数退出时,对值的任何更改都将丢失。也就是说,您所有的重新分配都不会影响变量matrix
from的值main
。如果
realloc
vdel
释放旧内存,则bmatrix
将main
保留旧值,即 变成一个悬空指针。这似乎是您的情况。