[英]Segmentation fault when “reallocating” new memory for 2D array C
我很难为2D数组重新分配内存。 每当我尝试修改此后已重新分配的数组时,都会遇到分段错误。 我的代码仅适用于数组的默认大小,只有当我用grow
重新分配时,它才会卡住。 你明白为什么吗?
此外,您知道重新分配2D数组的最原子和最短的方法是什么? 这样做时通常有什么好的做法?
这是代码:
void grow(int **arr, int size_r, int size_c, int newsize_r, int newsize_c)
{
int **newarr = (int **)malloc((size_t)newsize_r * sizeof(int *));
for (int i = 0; i < newsize_r; ++i) {
newarr[i] = (int *)malloc((size_t)newsize_c * sizeof(int));
if (i < size_r) {
memcpy(newarr[i], arr[i], (size_t) size_c * sizeof(int));
free(arr[i]);
}
}
free(arr);
arr = newarr;
}
我得到的地址是arr
0x7fff88fbd338
和newarr
: 0x7fff88fbd348
。
我在这里使用它, read
读取stdin并将每一行存储在2D数组中。
int read(int **s, int count, int size, int len) {
int c, i = 0, j;
int temp = size; //1d
int temp2 = len; //2d
for (j = 0; j < temp; j++) {
s[j][len - 1] = -1; /* sentinel */
}
while ((c = getchar()) != EOF) {
if (count == temp) {
/* realloc 1D */
grow(s, temp, temp2, 2 * temp, temp2);
temp = 2 * temp;
if (!s) { /*check*/ }
for (j = count + 1; j < temp; j++) {
/* first here segmentation fault */
s[j][temp2 - 1] = -1;
}
}
if (s[count][i] == -1) {
/* realloc 2D */
grow(s, temp, temp2, temp, 2 * temp2);
temp2 = 2 * temp2;
for (j = count + 1; j < temp; j++)
s[j][temp2 - 1] = -1;
if (!s[count]) { /*check*/ }
}
/* more code, irrelevant here */
}
}
使用哨兵-1
正确的吗? 如果不是为什么?
此外,如果您还有关于样式,格式等的其他一般性评论,我将很高兴看到它们。
您应该在您的grow
函数中通过引用传递arr
。 当前,您正在函数的末尾修改局部变量。 在您的函数之外将看不到该分配,从而导致该处的代码仍使用旧指针。 您释放了指针在函数中指向的内存,这导致了您未定义的行为。 您可以通过引用传递数组(另一个指向它的指针)来轻松解决此问题:
void grow(int ***arr, int size_r, int size_c, int newsize_r, int newsize_c)
{
int **newarr = (int **)malloc((size_t)newsize_r * sizeof(int *));
for (int i = 0; i < newsize_r; ++i) {
newarr[i] = (int *)malloc((size_t)newsize_c * sizeof(int));
if (i < size_r) {
memcpy(newarr[i], (*arr)[i], (size_t) size_c * sizeof(int));
free((*arr)[i]);
}
}
free(*arr);
*arr = newarr;
}
然后在您的代码中,将数组的地址传递给函数:
grow(&s, /*Other parameters*/);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.