在头文件中定义数组并将其存储在堆栈中

Define array in header and storing it in stack

我需要定义一个全局数组,它必须在每个文件中都可见。我在头文件中声明了它,但它存储在堆中而不是堆栈中。我怎样才能把它放在堆栈中?谢谢

编辑: 我使用的是 ATMEGA32,数组放在 RAM 的开头(地址 0x0060),而我需要把它放在末尾(地址 0x085F)

common.h

#define dimension 5
unsigned int board[dimension][dimension];

main.c

#include "common.h"

您在头文件中定义了数组变量。如果您将它包含在多个文件中,您将对同一个全局变量有重复(或多个)定义,这将被链接器报告为错误。

在头文件中你应该只像

这样声明
extern unsigned int board[dimension][dimension];

和文件范围内恰好一个 C 文件中的定义,即不在函数中。例如,您可以在 main.c

中使用此定义
unsigned int board[dimension][dimension];

如果要访问多个.c文件中的变量,就必须这样


要将此变量放入堆栈,它必须在函数内部,例如在 main() 中,但是这样你就不能将它用作全局变量。您可以将指针变量用作全局变量,并在 main() 中使用数组地址对其进行初始化。这有一个缺点,即使用指针的函数无法从变量本身确定两个数组维度。当然他们可以使用预处理器符号。

示例:

common.h

#ifndef COMMON_H
#define COMMON_H

#define dimension 5
extern unsigned int (*board)[dimension];

#endif // COMMON_H

main.c

#include "common.h"
#include "other.h"

unsigned int (*board)[dimension];

int main(void)
{
    unsigned int the_board[dimension][dimension] = {{ 0 }};

    board = the_board;

    printf("board[1][2] = %d\n", board[1][2]);

    some_function();

    printf("board[1][2] = %d\n", board[1][2]);

    return 0;
}

other.h

#ifndef OTHER_H
#define OTHER_H

void some_function(void);

#endif // OTHER_H

other.c

#include "common.h"
#include "other.h"

void some_function(void)
{
   board[1][2] = 3;
}

如果你想让变量位于特定地址或特定地址范围内(但不在堆栈上),你可以使用(特定于链接器的)链接描述文件在特定地址范围内定义内存部分,并且使用(特定于编译器的)#pragma section("name")__attribute__((section("name"))) 将普通全局变量放入此内存部分。