【问题标题】:C static pointer for dynamic array动态数组的 C 静态指针
【发布时间】:2017-07-03 01:50:54
【问题描述】:

我有一个模块化 C 程序,其中每个模块都使用静态全局变量来共享模块函数之间的变量访问,而不是其他模块。现在需要一个动态分配的数组,所有模块函数都可以类似地访问它,但我不熟悉malloc。下面是我正在尝试做的一个简化示例。这似乎是正确的方法,但我很害羞,因为我找不到任何类似的例子(而且因为真实的事情要复杂得多)。我可以像这样维护一个静态指针并使用mallocfree 来分配任何来来去去的内存块,但保持指向当前块的良好指针吗?

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;
}

【问题讨论】:

  • 你可以。如果事实如此,我不明白为什么要将自己限制在任何特定的数据大小上。当前限制用完后,您可以realloc 阻止。

标签: c dynamic malloc


【解决方案1】:

是的,这(几乎)会起作用。如果您使用多个线程访问此结构,它将失败。

pushData 有缺陷。它将第一个元素放置在 dataBlock[1]。假设大小为 3:

呼叫 1 -- 数据块[1] 设置

2 -- 数据块[2] 设置

3 -- dataBlock[3] set -- 越界。

【讨论】:

  • 同意缺陷并修复它(您应该删除该评论吗?)。请详细说明您关于多线程的第一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2016-02-03
相关资源
最近更新 更多