gpt4 book ai didi

c - 使用传递引用/取消引用的奇怪行为

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

这是我的演示代码:

#include <stdio.h>

#define WORK 0

typedef struct FooStruct {
int x;
} FooStruct;

void setX(FooStruct *foo_ptr) {
FooStruct foo = *foo_ptr;

if (WORK) {
foo_ptr->x = 10;
} else {
foo.x = 10;
}
}

FooStruct makeFoo() {
FooStruct foo = { 0 };

setX(&foo);

return foo;
}

int main(void) {
FooStruct foo = makeFoo();

printf("X = %d\n", foo.x);

return 0;
}

如果 WORK 定义为 1,则代码按预期执行并打印“X = 10”。

但是,如果 WORK 设置为 0,它会打印“X = 0”,或者如果 FooStruct 未默认初始化(即,将 FooStruct foo = {}; 更改为 FooStruct foo;),valgrind 将抛出一个值printf 行上的未初始化错误。

我确定这是由于我的理解存在差距,但对我来说,两个不同的 WORK 分支在操作上应该是基本相同的,所以我不确定误解从何而来。

这是使用 gcc 8.2.0 编译的,有/没有 valgrind,结果相同。

=======================

编辑:

简化示例:

#include <stdio.h>

#define WORK 0

void setX(int *x_ptr) {
if (WORK) {
*x_ptr = 5;
} else {
int x = *x_ptr;
x = 5;
}
}

int main(void) {
int x = 0;
setX(&x);

printf("X = %d\n", x);

return 0;
}

最佳答案

当您也 #define WORK 0 时,代码似乎按预期工作。如果您在结构的副本中设置成员,则不应期望修改原始结构。

你有:

void setX(FooStruct *foo_ptr) {
FooStruct foo = *foo_ptr;

if (WORK) {
foo_ptr->x = 10; // Modify the structure pointed to by foo_ptr
} else {
foo.x = 10; // Modify the local copy of the structure
}
}

因为您已经制作了一个 MCVE(Minimal, Complete, Verifiable Example — 谢谢!),所以在 setX() 中没有对结构的修改副本进行任何操作。

关于c - 使用传递引用/取消引用的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55340269/

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