c - C中缓冲区的分配

标签 c buffer allocation

我正在尝试创建缓冲区来存储无限大小的符号。

我有这样的结构:

typedef struct buffer {  
    int bufferSize;  
    int literalSize;  
    int allocatedSize;  
    char *bufferPtr;  
} bufferStruct;

在我的file.h中。

我还有缓冲区的功能:

bufferStruct *BufferInitialize(int size) {
    bufferStruct *tempBuff;
    tempBuff = (bufferStruct *)malloc(sizeof(bufferStruct));
    if (tempBuff == NULL) {
        exit(99);       // MEMORY_ERROR
    }
    tempBuff->bufferSize = size;
    tempBuff->literalSize = 0;
    tempBuff->bufferPtr = NULL;
    tempBuff->allocatedSize = 0;

    return (tempBuff);
}

int addToBuffer(bufferStruct *buffer, char c) {
    if (buffer == NULL) {
        return 99;      // MEMORY_ERROR
    }
    if (buffer->allocatedSize > buffer->literalSize) {
        buffer->bufferPtr[buffer->literalSize++] = c;
    } else {
        buffer->bufferPtr = realloc(buffer->bufferPtr, (buffer->allocatedSize + buffer->bufferSize) * sizeof(char));
        if (buffer->bufferPtr == NULL) {
            return 99;      // MEMORY_ERROR
        }
        buffer->allocatedSize += buffer->bufferSize;
        buffer->bufferSize <<= 1;   // bS = bS * 2
        buffer->bufferPtr[buffer->literalSize++] = c;
    }
    return 0;
}

int bufferDestroy(bufferStruct *buffer) {
    if (buffer == NULL) {
        return 99;      // MEMORY_ERROR
    }
    free(buffer->bufferPtr);
    free(buffer);
    return 0;
}

在我的 file.c 中,我正在尝试创建缓冲区:

 token *getNextToken(token *tokenT) {
    token *actualToken = NULL;
    char *bufferData = NULL;
    int charFromFile;
    eState state = stateInit;

    bufferStruct *bufferT = NULL;

    while ((charFromFile = fgetc(fp))) {                
        switch (state) {
          case stateInit: {
                if (isdigit(charFromFile)) {
                    bufferT = BufferInitialize(8);
                    addToBuffer(bufferT, charFromFile);
                    state = stateInt;
                } else
                if (isalpha(charFromFile) || (charFromFile == '_')) {
                    state = stateId;
                    bufferT = BufferInitialize(16);
                    addToBuffer(bufferT, charFromFile);
                } else
                if (isspace(charFromFile)) {
                    state = stateInit;

                ... some more conditions ... it's similar, a lot.

          case stateInt: {
                if (isdigit(charFromFile)) {
                    state = stateInt;
                    addToBuffer(bufferT, charFromFile);
                } else
                if ((charFromFile == 'e') || (charFromFile == 'E')) {
                    state = stateExp;
                    addToBuffer(bufferT, charFromFile);
                } else
                if (charFromFile = '.') {
                    state = stateDouble;
                    addToBuffer(bufferT, charFromFile);
                } else {
                    bufferData = bufferT->bufferPtr;
                    //strcpy(actualToken->content, bufferData);
                    addToBuffer(bufferT, '\0');
                    bufferDestroy(bufferT);
                    actualToken->type = tokenInt;
                    return actualToken;
                }
            } break;

               ... other similar cases ... 
            }
        }
    }

问题是当我尝试这样做时,Visual Studio 给我错误:

One or more multiply defined symbols found Also gives me already defined in main.obj for every function I have.

我看不到出路。我究竟做错了什么 ?

最佳答案

您的代码中存在多个问题:

  • 您不应该将代码放在头文件中。函数 BufferInitialize 不应位于 file.h 中,除非它被定义为 inline

  • 测试 while (c = fgetc(fp)) 不正确:您使用赋值作为测试表达式,它很容易出错,您至少应该将赋值表达式括起来,并可能测试 EOF 而不是 '\0':while ((c = fgetc(fp)) != EOF)。此外,c 必须定义为 int。发布实际代码,而不是伪代码。

  • 您将 tempBuff->bufferSize 初始化为一个可能非零的值,而 allocatedSize0 且缓冲区未分配.这似乎不正确。

您的实际代码中可能存在更多问题,我们看不到代码的内容,如何告诉您这些问题?始终发布一个完整的、可编译的代码来演示问题。

关于c - C中缓冲区的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38696653/

相关文章:

c - fwrite 将错误指示器放在 C 中的流上

c - 为什么要在 Linux 中关闭管道?

c - 在 C 中为各种事物重复使用相同的缓冲区名称是一种常见的做法吗?

c# - Websockets 将 byte[] 转换为字符串

从头开始创建 a.out 可执行文件

c - 学习 C 指针我不明白为什么这不起作用(K&R 练习 5-2)

c++ - 写入内存缓冲区时的性能损失 (C++)

c# - 使用 SocketAsyncEventArgs 时是否可以删除 ExecutionContext 和 Thread 分配?

ios - iOS 中的 [Class new] 和 [[Class alloc] init] 有什么区别?

c - 确定 C 中动态分配内存的大小