内存分配函数返回的点
Points returned by memory allocation functions
我正在从 K.N.King 的书中学习 C,并且正在完成第 17 章的编程项目。我在完成第一个项目时遇到了一个自己造成的错误。这是程序的未定义行为,因为我正在传递 realloc() 一个从较早的 malloc() 调用返回的指针的 copy,因为 realloc() 调用发生在其他函数中比主要()。在重新阅读本章的部分内容后,我意识到 realloc() 在这种情况下具有未定义的行为。
我试图搜索为什么会这样,但无济于事。那么这里有人知道为什么传递给 realloc() 的指针必须是从较早的 malloc()、calloc() 或 realloc() 调用返回的指针,而不是它们的副本吗?另外,每当我们想要调整内存块大小时,我们不是天生就总是复制 realloc() 返回的指针吗?
int num_parts = 0, max_parts = 10;
int main(void)
{
struct part *inventory = malloc(max_parts * sizeof(*inventory));
\...
switch(ch) {
\...
case 'i':
insert(inventory, &num_parts, &max_parts);
break;
\...
}
}
void insert(struct part *inventory, int *num_parts, *max_parts)
{
if (*num_parts == *max_parts) {
*max_parts += 10;
struct part *temp = realloc(inventory, max_parts * sizeof(*temp));
if (temp != NULL)
inventory = temp;
else
printf("Error:...\n");
}
\...
}
函数insert
接受指针inventory
的值
void insert(struct *inventory, int *num_parts, *max_parts)
和
insert(inventory, &num_parts, &max_parts);
表示函数处理的是原指针值的副本。在函数内更改副本,如
if (temp != NULL)
*inventory = temp;
不影响main中声明的原始指针的值。
您需要通过指向它的指针按引用传递指针。
也就是
insert( &inventory, &num_parts, &max_parts);
函数看起来像
void insert(struct **inventory, int *num_parts, *max_parts)
{
if (*num_parts == *max_parts) {
*max_parts += 10;
struct part *temp = realloc( *inventory, max_parts * sizeof(*temp));
if (temp != NULL)
*inventory = temp;
else
printf("Error:...\n");
}
\...
}
在这种情况下,在函数中取消引用函数参数 struct **inventory
我们可以直接访问原始指针(对象),从而可以更改它。
我正在从 K.N.King 的书中学习 C,并且正在完成第 17 章的编程项目。我在完成第一个项目时遇到了一个自己造成的错误。这是程序的未定义行为,因为我正在传递 realloc() 一个从较早的 malloc() 调用返回的指针的 copy,因为 realloc() 调用发生在其他函数中比主要()。在重新阅读本章的部分内容后,我意识到 realloc() 在这种情况下具有未定义的行为。
我试图搜索为什么会这样,但无济于事。那么这里有人知道为什么传递给 realloc() 的指针必须是从较早的 malloc()、calloc() 或 realloc() 调用返回的指针,而不是它们的副本吗?另外,每当我们想要调整内存块大小时,我们不是天生就总是复制 realloc() 返回的指针吗?
int num_parts = 0, max_parts = 10;
int main(void)
{
struct part *inventory = malloc(max_parts * sizeof(*inventory));
\...
switch(ch) {
\...
case 'i':
insert(inventory, &num_parts, &max_parts);
break;
\...
}
}
void insert(struct part *inventory, int *num_parts, *max_parts)
{
if (*num_parts == *max_parts) {
*max_parts += 10;
struct part *temp = realloc(inventory, max_parts * sizeof(*temp));
if (temp != NULL)
inventory = temp;
else
printf("Error:...\n");
}
\...
}
函数insert
接受指针inventory
的值
void insert(struct *inventory, int *num_parts, *max_parts)
和
insert(inventory, &num_parts, &max_parts);
表示函数处理的是原指针值的副本。在函数内更改副本,如
if (temp != NULL)
*inventory = temp;
不影响main中声明的原始指针的值。
您需要通过指向它的指针按引用传递指针。
也就是
insert( &inventory, &num_parts, &max_parts);
函数看起来像
void insert(struct **inventory, int *num_parts, *max_parts)
{
if (*num_parts == *max_parts) {
*max_parts += 10;
struct part *temp = realloc( *inventory, max_parts * sizeof(*temp));
if (temp != NULL)
*inventory = temp;
else
printf("Error:...\n");
}
\...
}
在这种情况下,在函数中取消引用函数参数 struct **inventory
我们可以直接访问原始指针(对象),从而可以更改它。