gcc 4.4.3 c89
我有以下代码作为我想要做的样本。在我输入函数之前,我不知道数组的实际大小。但是,我认为在声明之后我不能设置数组大小。我需要全局,因为其他一些函数需要访问设备名称。
非常感谢任何建议,
/* global */
char *devices_names[];
void fill_devices(size_t num_devices)
{
devices_names[num_devices];
/* start filling */
}
答案 0 :(得分:3)
让它变得动态:
char **g_device_names;
int g_num_devices;
void fill_devices(size_t num_devices) {
g_device_names = malloc(sizeof(char*) * num_devices);
g_num_devices = num_devices;
...
}
答案 1 :(得分:3)
如果您使用的是全局数组,那么您需要在声明它时知道它的大小(或它的最大大小)。 E.g。
char *devices_names[MAX_DEVICES];
如果你不能这样做,那么你别无选择,只能使用指针和动态分配的内存。
E.g。
char **devices_names = 0;
void fill_devices(size_t num_devices)
{
devices_names = malloc( num_devices * sizeof *devices_names );
/* ... */
}
当然这会产生一些影响,例如如何防止人们在分配数据之前访问数组以及何时释放它?
答案 2 :(得分:2)
您需要使用malloc:
动态分配内存char **device_names;
void fill_devices(size_t num_devices)
{
device_names = malloc(num_devices * sizeof(char*));
}
然后在不再需要时使用free(device_names);
释放内存。
答案 3 :(得分:2)
您应该使用指针,因此当您输入方法时,仍未声明数组。
您可以使用malloc
设置正确的尺寸。看看这篇文章:arrays and malloc