包含指向堆分配内存的指针的c结构的call-by-value

时间:2015-02-11 22:20:48

标签: c struct heap-memory

亲爱的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

1 个答案:

答案 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中的指针将导致未定义的行为。