【发布时间】:2019-04-15 21:02:51
【问题描述】:
请考虑以下代码:
// Thing is a typedef struct
void f(Thing* things, int size) {
for (int i = 0; i < size; i++) {
Thing my_thing = things[i];
my_thing.a = 10;
}
}
things 指向的数组分配在堆上的某处。
然而 - my_thing 是一个“堆栈变量” - 分配在堆栈上。
那么幕后发生了什么? things[i] 复制到堆栈并存储在my_thing 中吗? my_thing.a = 10; 做了什么 - 它是修改原始的 things[i] 还是修改“堆栈副本”?
【问题讨论】:
-
是的,
things[i]被逐个成员复制到堆栈中,进入my_thing,不,my_thing.a = 10;不会修改things[i]。 -
如果你真的想要一个数组,你应该请求一个数组而不是一个指针。
ptrdiff_t也更适合作为数组大小。void f(ptrdiff_t size, Thing things[size]) -
@CacahueteFrito,我不确定我是否跟随。理想情况下,它应该是
size_t size,但如果元素的数量在int的范围内,int就足够了。使用ptrdiff_t不会改变任何东西。 -
我知道你会放弃
int,我认为这没有必要或有益,@CacahueteFrito。就像我说的,我似乎没有说服你。没关系;你可以有自己的意见。我可能最终不得不与你发生很多矛盾,但有时这就是生活。