我有一个模块化的C程序,其中每个模块使用静态全局变量来对模块的函数之间的变量进行共享访问,但不对其他模块进行共享访问。现在需要一个动态分配的数组,所有模块函数都可以访问它,但我不熟悉malloc
。下面是我正在尝试做的简化示例。这似乎是正确的方法,但我触发害羞,因为我找不到任何类似的例子(因为真实的事情要复杂得多)。我可以维护这样的静态指针,并使用malloc
和free
来分配来去的内存块,但保留一个指向当前块的好指针吗?
static int *dataBlock = NULL;
static int dataSize = 0, dataCursor = 0;
// Init - called externally
int initData(size) {
if (dataBlock || dataSize > 0) {
return -1;
}
dataBlock = malloc(sizeof(*dataBlock) * size);
if (!dataBlock) {
return -1;
}
dataSize = size;
dataCursor = 0;
return 0;
}
// Push - called externally
int pushData(value) {
if (dataCursor >= dataSize) {
return -1;
}
dataBlock[dataCursor] = value;
dataCursor++;
return dataCursor;
}
// Free - called externally
void freeData() {
free(dataBlock);
dataSize = 0;
dataCursor = 0;
dataBlock = NULL;
}
答案 0 :(得分:0)
是的,这将(几乎)有效。如果使用多个线程访问此结构,则会失败。
pushData存在缺陷。它将第一个元素放在dataBlock [1]中。假设大小为3:
呼叫 1 - dataBlock [1]设置
2 - dataBlock [2] set
3 - dataBlock [3]设置 - 越界。