在一个函数中分配一个二维数组并在另一个函数中重新分配它?
Allocating a 2D array in one function and reallocating it in another function?
这是我的代码:
void allocating(char **word_array)
{
int i = -1;
while(i < 20)
{
i++;
printf("%d \n", i);
word_array[i] = malloc(strlen("hello good sir") + 1);
strcpy(word_array[i], "hello good sir");
if (i = 9)
{
word_array = realloc(word_array, 20 * sizeof(char *));
}
}
}
int main()
{
char **word_array = malloc(sizeof(char *) * 10);
allocating(word_array);
free(word_array);
int i;
for (i = 0; i < 20; i++)
{
printf("%s \n", word_array[i]);
free(word_array[i]);
}
}
我正在尝试动态内存分配,但我似乎无法让代码正常工作。它在 i = 10 时运行无限循环。分配下一个内存位置有问题吗?为什么它一直打印 10 而不是递增?
谢谢!
此代码有多个问题。第一:
if (i = 9)
这是一个赋值,而不是比较,所以因为赋值是 non-zero,所以条件总是为真。你想要:
if (i == 9)
其次,您比预期多循环了一次:
while(i < 20)
{
i++;
当 i
为 19 时,条件通过并进入循环,然后 i
立即递增到 20,这超出了已分配数组的边界。
相反,将 i
初始化为 0 并在循环的 结束 执行递增。
第三,当你在 allocating
中执行此操作时
word_array = realloc(word_array, 20 * sizeof(char *));
您正在修改局部变量。对它的更改不会反映在函数之外。因此,当 main
中的函数 returns word_array
将具有与之前相同的值时,如果 realloc
移动了内存,它将不再是有效指针。
需要更改函数以获取 char **
的地址,即 char ***
:
void allocating(char ***word_array)
{
int i = 0;
while(i < 20)
{
printf("%d \n", i);
(*word_array)[i] = malloc(strlen("hello good sir") + 1);
strcpy((*word_array)[i], "hello good sir");
if (i == 9)
{
*word_array = realloc(*word_array, 20 * sizeof(char *));
}
i++;
}
}
并且调用更改为传递地址:
allocating(&word_array);
最后,您 free(word_array)
在函数 returns 之后紧接着使用 word_array
。释放后读取指针值是 undefined behavior.
在您使用完指针后,将调用移至free
。
这是我的代码:
void allocating(char **word_array)
{
int i = -1;
while(i < 20)
{
i++;
printf("%d \n", i);
word_array[i] = malloc(strlen("hello good sir") + 1);
strcpy(word_array[i], "hello good sir");
if (i = 9)
{
word_array = realloc(word_array, 20 * sizeof(char *));
}
}
}
int main()
{
char **word_array = malloc(sizeof(char *) * 10);
allocating(word_array);
free(word_array);
int i;
for (i = 0; i < 20; i++)
{
printf("%s \n", word_array[i]);
free(word_array[i]);
}
}
我正在尝试动态内存分配,但我似乎无法让代码正常工作。它在 i = 10 时运行无限循环。分配下一个内存位置有问题吗?为什么它一直打印 10 而不是递增?
谢谢!
此代码有多个问题。第一:
if (i = 9)
这是一个赋值,而不是比较,所以因为赋值是 non-zero,所以条件总是为真。你想要:
if (i == 9)
其次,您比预期多循环了一次:
while(i < 20)
{
i++;
当 i
为 19 时,条件通过并进入循环,然后 i
立即递增到 20,这超出了已分配数组的边界。
相反,将 i
初始化为 0 并在循环的 结束 执行递增。
第三,当你在 allocating
word_array = realloc(word_array, 20 * sizeof(char *));
您正在修改局部变量。对它的更改不会反映在函数之外。因此,当 main
中的函数 returns word_array
将具有与之前相同的值时,如果 realloc
移动了内存,它将不再是有效指针。
需要更改函数以获取 char **
的地址,即 char ***
:
void allocating(char ***word_array)
{
int i = 0;
while(i < 20)
{
printf("%d \n", i);
(*word_array)[i] = malloc(strlen("hello good sir") + 1);
strcpy((*word_array)[i], "hello good sir");
if (i == 9)
{
*word_array = realloc(*word_array, 20 * sizeof(char *));
}
i++;
}
}
并且调用更改为传递地址:
allocating(&word_array);
最后,您 free(word_array)
在函数 returns 之后紧接着使用 word_array
。释放后读取指针值是 undefined behavior.
在您使用完指针后,将调用移至free
。