c# 在嵌入式C语言中,编译器为指向结构的指针分配相同的内存

irlmq6kh  于 2023-11-15  发布在  C#
关注(0)|答案(2)|浏览(242)

我有一个结构,我已经使用指向struct的指针创建了该结构的两个示例,并且我希望它们根据输入返回两个不同的值。如果我在Visual Studio Code中执行此代码,我会看到int_struct_pt1和int_struct_pt2在内存中具有相同的地址。因此,当int_struct_pt2接收到它时,int_struct_pt1会被int_struct_pt2的相同值覆盖。
我正在使用STM32F4,所以我不想使用动态内存分配。有没有其他方法可以在不被覆盖的情况下获取这些数据,或者如何处理内存分配。

//int_struct.h
//Declaration in header file
typedef struct {
    int a;
    int b;
} int_struct;

int_struct * func(int a);

//int_app.c
//Pointer to struct in source file 
static int_struct* int_struct_pt1;
static int_struct* int_struct_pt2;
int_struct_pt1 = func(10);
int_struct_pt2 = func(16);

//int_struct.c
static int_struct int_struct_app;
int_struct * func(int a ){
    int_struct_st.a = a;
    int_struct_st.b = 15;
    return &int_struct_st;
}

字符串
谢谢
尝试创建不同的变量。检查并看到指针具有相同的内存地址。我的期望是在C中获得最好的方法来执行此功能而不会被覆盖。

li9yvcax

li9yvcax1#

您可以将func更改为初始化函数:

void func(int_struct *st, int a ){
    st->a = a;
    st->b = 15;
}

字符串
在其他地方,为每个示例定义一个变量:

static int_struct int_struct_1;
static int_struct int_struct_2;


如果你真的需要使用指针变量:

static int_struct* int_struct_pt1 = &int_struct_1;
static int_struct* int_struct_pt2 = &int_struct_2;


调用函数初始化int_struct

func(&int_struct_1, 10);
    func(&int_struct_2, 16);


或:

func(int_struct_pt1, 10);
    func(int_struct_pt2, 16);

mcvgt66p

mcvgt66p2#

static int_struct int_struct_st;

字符串
只有一个示例,如果你调用你的函数,它总是返回同一个对象的同一个地址。
你需要在每次调用这个函数的时候创建一个结构体:
通常(因为这是一个小型MCU医疗项目),你应该实现静态分配的memory pools分配器/释放器,它不会对堆进行碎片化。这是一个非常简单的实现示例:

#define MAXINITS 4

static int_struct ist[MAXINITS];
static int taken;

int_struct * func(int a )
{
    if(taken < MAXINITS)
    {
        ist[taken].a = a;
        ist[taken++].b = 15;
        return &ist[taken -1];
    }
    return NULL;
}


或者使用malloc

int_struct * func(int a ){
    int_struct *st = malloc(sizeof(*st);
    if(st)
    {
        st -> a = a;
        st -> b = 15;
    }
    return st;
}

相关问题