我的目标是访问max_resources_per_client[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;
如何在不导致分段错误的情况下访问max_resources_per_client[1][1]
?
注意:尝试
extern const unsigned int max_resources_per_client[num_clients][num_resources];
导致错误:variably modified ‘max_resources_per_client’ at file scope
注意:尝试extern const unsigned int max_resources_per_client[NUM_CLIENTS][NUM_RESOURCES];
导致错误:NUM_RESOURCES’ undeclared here (not in a function)
答案 0 :(得分:2)
参考此 - > How to declare extern 2d-array in header?
您至少需要包含二维数组的最右列大小。您可以这样声明:
Random rndm = new Random();
for (int i = 0; i < 10000; i++)
{
myarray.add(i, rndm.nextInt());
}
否则编译器将无法计算第一行之后的偏移量。
答案 1 :(得分:1)
max_resources_per_client
是无符号整数的二维数组,与unsigned int **
(指向unsigned int的指针)不同。 extern声明需要将max_resources_per_client
声明为数组。 extern声明应该看起来像conf.c中的定义但没有初始化器:
const unsigned int max_resources_per_client[NUM_CLIENTS][NUM_RESOURCES];
您实际上并不需要NUM_CLIENTS,以便编译器知道发生了什么,所以您可以这样声明:
const unsigned int max_resources_per_client[][NUM_RESOURCES];
编译器至少需要知道第二个维度,以便它可以计算到数组中的正确偏移量。上述声明告诉它每一行&#34;行&#34;数组包含NUM_RESOURCES
无符号整数,这允许它计算任何元素的偏移量。