【问题标题】:C: Store reference to stack variable in arrayC:在数组中存储对堆栈变量的引用
【发布时间】:2018-06-21 17:34:53
【问题描述】:

我正在编写一个在嵌入式 MCU 上运行的程序,因此我所有的内存分配都分配给了堆栈(没有 malloc())。我在函数中创建了一个结构并返回给调用者,我试图在返回之前将对该变量的引用保留在数组中。

问题是存储在数组中的变量似乎是返回给调用者的变量的副本,因此它们不同步。下面的代码说明了这个问题:

#include <stdio.h>
int *ARRAY_OF_VARIABLES[1];

int initalizeVariables() {
    int i = 0;
    ARRAY_OF_VARIABLES[0] = &i;
    return i;
}

int main(void)
{
    int test = initalizeVariables();
    test = 1;
    printf ("Test: %d, ARRAY_OF_VARIABLES[0]: %d\r\n", test, (int)*ARRAY_OF_VARIABLES[0]);
}

这会打印:Test: 1, ARRAY_OF_VARIABLES[0]: 0

如何在没有 malloc() 和指针的情况下使“test”和“ARRAY_OF_VARIABLES[0]”保持同步?

【问题讨论】:

  • 你做不到。当函数返回时,它的局部变量全部被销毁。指向它们的指针变得无效。
  • 如果您没有malloc(),请使用全局变量,而不是局部变量。
  • 你也可以使用static int i = 0;
  • 另一个选项是在main(或任何需要的范围级别)中创建变量并将指向它们的指针传递给initialize函数,以便initialize可以修改值.
  • 另外,澄清一下,test 接收本地变量 i 的副本,而 ARRAY_OF_VARIABLES[0] 包含指向原始变量的指针(但现在超出范围和垃圾)。

标签: c reference stack


【解决方案1】:

我通过创建一个函数解决了这个问题,我可以将i 的指针传递回ARRAY_OF_VARIABLES 中的存储空间。这是新代码:

#include <stdio.h>
int *ARRAY_OF_VARIABLES[1];

int initalizeVariables() {
    int i = 0;
    return i;
}

void setInArray(int *i, int idx) {
    ARRAY_OF_VARIABLES[idx] = i;
}

int main(void)
{
    int test = initalizeVariables();
    setInArray(&test, 0);
    test = 123;
    printf ("Test: %d, ARRAY_OF_VARIABLES[0]: %d\r\n", test, *ARRAY_OF_VARIABLES[0]);
}

如果有任何更好的方法可以做到这一点,请随时发布:)。

【讨论】:

  • 您根本没有将指针传递给 i!您正在传递一个指向 test 的指针,这是一个与 i 不同的变量。你的 initializeVariables 函数什么都不做,你可以用 return 0 替换它;你能举一个更好的例子来说明你正在尝试做什么吗?如果只有静态分配,为什么要使用指针?为什么不直接使用全局变量?
猜你喜欢
  • 2015-01-24
  • 2015-03-13
  • 2015-03-09
  • 2015-04-18
  • 1970-01-01
  • 2021-06-19
  • 2016-03-05
  • 2017-11-05
相关资源
最近更新 更多