gpt4 book ai didi

包含指向堆分配内存的指针的 C 结构体的按值调用

转载 作者:行者123 更新时间:2023-11-30 20:13:55 25 4
gpt4 key购买 nike

亲爱的 stackoverflowers。

在尝试使用 c 和结构时,我和我的一个 friend 遇到了一些我们无法完全理解的事情。下面是描述带有 int 指针和变量的结构的代码片段。它们都是在主函数中创建结构时设置的。

我们想知道 c 如何处理结构上的按值调用。引用调用是所有清晰、简单的引用,并且所有修改的内容都会发生变化。现在奇怪或有趣的是按值调用。该结构被复制为局部变量,结构中的指针和长度值也被复制。基本上创建另一个指向同一堆内存的指针。 (如果我错了请纠正我)。

不,如果你释放这个指针会怎样。这是否意味着您丢失了那里的信息?不一定,因为信息可能仍然存在并在您的页面内。但是如果你再次 malloc 指针怎么办?

为什么信息仍然存在?有和没有新的 malloc。这不是意味着操作系统给了你一 block 新的内存吗?为什么这个值还存在?如果您传递带有指向堆内存的指针的按值调用结构,通常会发生什么?

#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

最佳答案

当您按值调用时,代码会创建结构的副本以供函数使用。所以你有这种情况

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

关于包含指向堆分配内存的指针的 C 结构体的按值调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28465683/

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