我尝试使用伪代码来尝试着重于该问题并删除所有无关的内容。我在头文件中定义了一个结构:
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,则修改将在该结构上进行并返回,并且我可以对其进行测试,然后对其进行修改。那么如何在一个成员而不是另一个成员上工作呢?我很迷糊。有什么想法可以测试吗?
答案 0 :(得分:2)
您对全局数组的定义有误。您编写它的方式有两个全局数组(具有相同的名称),这就是该函数似乎没有更改任何内容的原因。
这样做
struct.h
typedef struct {
int value;
} structname
extern structname struct_array[];
Setup.c
#include "struct.h"
structname struct_array[NUMBER];
这就是全局变量的工作方式,您将它们定义在一个.c文件中(不必是Setup.c,只需选择任何一个),然后声明头文件中带有extern
的文件。