【问题标题】:Modifying a struct member via a pointer in a function [closed]通过函数中的指针修改结构成员[关闭]
【发布时间】:2018-12-18 06:45:56
【问题描述】:

我尝试使用伪代码来尝试专注于问题并删除任何无关的内容。我在头文件中有一个结构的定义:

struct.h

typedef struct {
    int value;
} structname;

static structname struct_array[NUMBER];

start.c

#include "struct.h"

static void functionA() {
    function1 (&struct_array[index]);
}

Setup.c

#include "struct.h"

int function1(structname * name) {
    int result = 0;   
    name->value = 2;   
    printf("The value before function2: d", result->value);   
    result = function2(name);   
    printf("The resulting value: d", result->value);
    printf("The address of the member to be modified is: %p", &(name->value));   
    return result;
}

Modification.c

#include "struct.h"

int function2(structname * name) {
    int result = 0;
    name->value = 1;
    printf("The resulting value: d", name->value);
    printf("The address of the member to be modified is: %p", &(name->value));
    return result;
}

这会返回:

The value before function2: 2
The resulting value: 1
The address of the member to be modified is: 12345
The resulting value:  2
The address of the member to be modified is: 12345

事情是这样的:地址是一样的。函数如何看起来正在修改结构的成员,但在函数返回时,结构成员保留其原始值?

我应该使用extern 关键字吗?如何以及在哪里?

编辑: 我想我会做一些测试,看看我是否能找到问题所在。我所做的只是迷惑自己。所以事实证明,如果我向结构添加第二个成员,比如 int nextValue,修改会在该结构上运行并返回,我可以对其进行测试,并且它会被修改。那么它怎么能对一个成员而不是另一个成员起作用呢?我很困惑。关于测试什么的任何想法?

【问题讨论】:

  • static structname struct_array[NUMBER]; 您是否知道每个包含struct.h 的C 文件(翻译单元)都有自己的struct_array 副本?如果将static 替换为extern 会发生什么变化?
  • 您提供的这段代码无法编译int result = 0;后跟`printf("The value before function2: d", result->value);`无效.请提供正确的minimal reproducible example
  • 只是猜测,因为您没有提供代码...您将其放在头文件中:static structname struct_array[NUMBER];。每个翻译单元都有自己的数组副本。您可以考虑将数组放在单个 C 文件中,然后在标头中将数组声明为 extern,以便程序中的目标文件使用一个数组。

标签: c function pointers struct member


【解决方案1】:

您的全局数组定义错误。您编写它的方式有两个全局数组(同名),这就是该函数似乎没有改变任何东西的原因。

这样做

struct.h
typedef struct {
   int value;
} structname

extern structname struct_array[];

Setup.c
#include "struct.h"

structname struct_array[NUMBER];

这就是全局变量的工作方式,您在一个 .c 文件中定义它们(不必是 Setup.c,随便选择一个),然后您声明他们在头文件中带有extern

【讨论】:

  • 虽然,我仍然不确定打印的相等地址...
  • @Scheff 问题中的代码甚至无法编译,即使编译了,它仍然不会生成该输出。所以我不会太看重该问题中所说的任何内容。
  • @user3386109 是的,同意。这似乎是合理的。 (否则,我不知道如何解释......);-)
  • @Scheff 没有注意到这一点。哦,好吧,如果还有问题,OP 可以再次联系。
  • 更好的解决方案:不要使用任何全局变量,尤其是当您是新手时更是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多