gpt4 book ai didi

c - 难以理解指针、动态分配和函数调用行为

转载 作者:太空宇宙 更新时间:2023-11-04 07:58:32 25 4
gpt4 key购买 nike

我在 C 语言中工作。

我有一个名为 Entity 的简单结构

typedef struct Entity
{
int x, y;
int velX, velY;
}Entity;

我正在创建一个 Entity 类型和大小为 1 的动态数组。然后我使用 addEntity 函数添加一个元素

void addEntity(Entity** array, int sizeOfArray)
{
Entity* temp = malloc((sizeOfArray + 1) * sizeof(Entity));

memmove(temp, *array, (sizeOfArray)*sizeof(Entity));

free (*array);
*array = temp;
}

然后我使用另一个函数来更改两个元素的值:

int main()
{
Entity* entities = malloc(sizeof(Entity)); // dynamic array of size 1

addEntity(&entities, 1); // add one element
changeValue(&entities[0], 10); // change the values of the first two elemebts
changeValue(&entities[1], 20);

printf("%d\n", entities[0].x); // print the values
printf("%d", entities[1].x);

free(entities); // free the memory

return 0;
}

void changeValue(Entity* entity, int nb)
{
entity->x = nb;
}

结果是 10 和 20,一切正常。现在,如果我改用这种语法

int main()
{
Entity* entities = malloc(sizeof(Entity)); // dynamic array of size 1
addEntityAndSetValues(entities);

printf("%d\n", entities[0].x); // print the values
printf("%d", entities[1].x);

free(entities); // free the memory

return 0;
}

void addEntityAndSetValues(Entity* entities)
{
addEntity(&entities, 1);
changeValue(&entities[0], 10);
changeValue(&entities[1], 20);
}

我没有得到 10 和 20,而是一些随机数。我真的不明白为什么。

最佳答案

原因是 C 是按值传递的。

在第二种情况下,当您传递指针时 - 它的一个副本被传递给函数。现在,当您编写 &entities 时,它是局部变量的地址。 main 中的变量看不到任何变化——因为您没有更改它们。所以你得到的是垃圾值。

更清楚

void addEntityAndSetValues(Entity* entities)
{
addEntity(&entities, 1); <--- entities is a local variable.
}

现在添加调用addEntity:

void addEntity(Entity** array, int sizeOfArray)
{
...
free (*array);
*array = temp; <--- assigning to the local variable the address of the allocated chunk.
}

然后您调用另一个函数来更改它的值 - 那些没问题。但是,当您从函数返回时,该局部变量中的所有内容都消失了。

如果你这样做 - 那么它就会起作用。

main()

addEntityAndSetValues(&entities);

addEntityAndSetValues()

void addEntityAndSetValues(Entity** entities)
{
addEntity(entities, 1);
changeValue(&(*entities)[0], 10);
changeValue(&(*entities)[1], 20);
}

在这里它起作用了,因为您已经在 main() 中传递了变量的地址,然后您对该变量进行了更改 - 并且它的值的每个更改都会反射(reflect)出来。

关于c - 难以理解指针、动态分配和函数调用行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48357939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com