通过函数中的指针修改结构成员

时间:2018-12-18 06:45:57

标签: c function pointers struct member

我尝试使用伪代码来尝试着重于该问题并删除所有无关的内容。我在头文件中定义了一个结构:

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,则修改将在该结构上进行并返回,并且我可以对其进行测试,然后对其进行修改。那么如何在一个成员而不是另一个成员上工作呢?我很迷糊。有什么想法可以测试吗?

1 个答案:

答案 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的文件。