在头文件中定义数组并将其存储在堆栈中
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")))
将普通全局变量放入此内存部分。
我需要定义一个全局数组,它必须在每个文件中都可见。我在头文件中声明了它,但它存储在堆中而不是堆栈中。我怎样才能把它放在堆栈中?谢谢
编辑: 我使用的是 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")))
将普通全局变量放入此内存部分。