亲爱的stackoverflowers。
在一些c和结构的实验中,我和我的一个朋友遇到了一些我们无法理解的东西。下面是一个代码片段,描述了一个带有int指针和变量的结构。它们都是在主函数中创建结构时设置的。
我们想知道c如何处理结构上的call-by-value。 call-by-reference是一个清晰,简单的引用,所有被修改的内容都会发生变化。现在,奇怪的或有趣的是伴随着价值的呼唤。结构被复制为局部变量,结构中的指针和长度值也是如此。基本上创建另一个指向同一堆内存的指针。 (如果我错了,请纠正我。)
如果您释放此指针,请不要这样做。这是否意味着你丢失那里的信息?不一定,因为信息可能仍然在您的页面内。但是如果再次使用malloc指针怎么办呢。
为什么信息仍然存在?有没有新的malloc。这是不是意味着操作系统会为您提供新的内存块?为什么这个价值仍然存在?一般情况下,如果使用指向堆内存的指针传递struct call-by-value会发生什么?
#include <stdio.h>
#include <stdlib.h>
typedef struct Struct
{
int* array;
int length;
} Struct;
void callByValue(Struct st)
{
st.array[1] = 11;
st.length = 11;
/* This is weird */
free(st. array);
}
void callByRef(Struct *st)
{
st->array[1] = 22;
st->length = 22;
}
int main()
{
Struct s;
s.array = malloc(2*sizeof(int));
s.array[1] = 0;
s.length = 0;
printf("Before array[1]: %d length: %d\n", s.array[1], s.length);
callByValue(s);
printf("Caal-by-value array[1]: %d length: %d\n", s.array[1], s.length);
callByRef(&s);
printf("Caal-by-reference array[1]: %d length: %d\n", s.array[1], s.length);
return 0;
}
输出
Before array[1]: 0 length: 0
Caal-by-value array[1]: 11 length: 0
Caal-by-reference array[1]: 22 length: 22
答案 0 :(得分:2)
当您按值调用时,代码会生成该函数使用的结构的副本。所以你有这种情况
main: s.array ---+
+---> MemA (memory for 2 ints)
callByValue: st.array ---+
在你free(st.array)
后,两个指针都无效,因为MemA
已被释放。
在你malloc(1000...)
之后,你有这种情况
main: s.array ---> MemA (invalid pointer)
callByValue: st.array ---> MemB (memory for 1000 ints)
main
中的指针不会更新并保持无效。使用main
中的指针将导致未定义的行为。