C 从int读取常量值**从int[]初始化

C 从int读取常量值**从int[]初始化,c,arrays,pointers,C,Arrays,Pointers,我的目标是访问每个客户机[1][1]的最大资源量 在不能修改的conf.c中,我得到: #define NUM_CLIENTS 5 #define NUM_RESOURCES 3 const unsigned int num_clients = NUM_CLIENTS; const unsigned int num_resources = NUM_RESOURCES; const unsigned int max_resources_per_client[NUM_CLIENTS][NUM_RES

我的目标是访问每个客户机[1][1]的最大资源量

在不能修改的
conf.c
中,我得到:

#define NUM_CLIENTS 5
#define NUM_RESOURCES 3
const unsigned int num_clients = NUM_CLIENTS;
const unsigned int num_resources = NUM_RESOURCES;
const unsigned int max_resources_per_client[NUM_CLIENTS][NUM_RESOURCES] = {
  {7, 5, 3},
  {3, 2, 2},
  {9, 1, 2},
  {2, 2, 2},
  {4, 3, 3},
};
在我的文件
main.c
中,我有:

extern const unsigned int num_clients;
extern const unsigned int num_resources;
extern const unsigned int **max_resources_per_client;
如何访问每个客户端[1][1]的最大资源量而不导致分段错误


注意:正在尝试

extern const unsigned int max_resources_per_client[num_clients][num_resources]

导致错误:
在文件范围内可变地修改了“每个客户端的最大资源”


注意:尝试执行
extern const unsigned int max_resources_per_client[NUM_CLIENTS][NUM_resources]

导致错误:
NUM\u RESOURCES'未在此处声明(不在函数中)
请参阅此->

对于二维数组,您至少需要包含最右边的列大小。您可以这样声明:

extern unsigned char LCD[][64];
const unsigned int max_resources_per_client[][NUM_RESOURCES];

否则编译器将无法计算第一行之后的偏移量。

max\u resources\u per\u client
是一个无符号整数的二维数组,它不同于
unsigned int**
(指向无符号整数的指针)。extern声明需要将每个客户端的最大资源声明为数组。extern声明应与conf.c中的定义类似,但不带初始值设定项:

const unsigned int max_resources_per_client[NUM_CLIENTS][NUM_RESOURCES];
实际上,编译器不需要NUM_客户机就可以知道发生了什么,所以可以这样声明:

extern unsigned char LCD[][64];
const unsigned int max_resources_per_client[][NUM_RESOURCES];

编译器至少需要知道第二个维度,以便计算数组中的正确偏移量。上面的声明告诉它,数组的每个“行”都包含
NUM\u RESOURCES
unsigned int,这允许它计算任何元素的偏移量。

const unsigned int**max\u RESOURCES\u per\u client
类型不匹配。如何从文件
main.c
访问
config.c
中定义的NUM\u资源?注意:没有
config.h
。理想情况下,
NUM\u RESOURCES
将位于.h文件中(以及外部声明)。如果不知道该维度,就不能使用该数组。您是否可以灵活地重新排列此代码?只有当数组定义也更改为
const unsigned int max_resources_per_client[NUM_resources*NUM_CLIENTS]时,“更新”中的代码才有效。根据最初的定义,这是一种未定义的行为。这是一种完全的黑客行为,我不建议使用它,但它当然有效。声明的二维数组是15个连续的无符号整数。我们确切地知道它在内存中的布局,因此让编译器将其视为一维数组并手动执行索引将产生正确的结果。在什么情况下不起作用?(我讨论过发布该解决方案,因为它不干净,但确实有效。不发布会更好吗?@AndySchweig未定义行为的结果之一似乎是正确的执行。我建议您删除无效的示例。出于文档目的,通常最好定义所有维度。