C语言中缓冲区的分配

C语言中缓冲区的分配,c,buffer,allocation,C,Buffer,Allocation,我试图创建缓冲区来存储无限大小的符号 我有这样的结构: typedef struct buffer { int bufferSize; int literalSize; int allocatedSize; char *bufferPtr; } bufferStruct; 在我的文件.h中 我还有缓冲区功能: bufferStruct *BufferInitialize(int size) { bufferStruct *tempBu

我试图创建缓冲区来存储无限大小的符号

我有这样的结构:

typedef struct buffer {  
    int bufferSize;  
    int literalSize;  
    int allocatedSize;  
    char *bufferPtr;  
} bufferStruct;
在我的文件.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;
}
问题是,当我尝试执行此操作时,Visual studio会给我错误:

找到一个或多个多重定义符号
也给我
已在main.obj中定义
对于我的每一个功能


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

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

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

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

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


在您的实际代码中可能会有更多的问题,我们无法看到代码是什么,如何告诉您这些问题?始终发布一个完整的、可编译的代码来演示问题。

头文件中是否有一些已定义的数据?顺便说一句,定义结构时,不需要在struct关键字后放置buffer请发布完整的代码。我想我可以留言了。我无法初始化。。给我第二个错误。代码很长,这就是我剪切它的原因。我发布了更多的代码。我将函数声明移到了“.c文件”。while条件在我的代码中是正确的。我也不能检查EOF,因为我需要继续在EOF后面。我相信错误比我能看到的要多,但我才刚刚开始。不幸的是,我被这个缓冲区错误绊住了。您必须了解诸如
extern-token*getNextToken(token*tokenT)等声明之间的区别,以及属于C源文件(.C扩展名)的定义,如
token*getNextToken(token*tokenT){/*some code*/return NULL;}
不能在同一个文件或不同的文件中复制。我知道这一点,我没有任何副本。我只是对缓冲区的功能有点困惑,所以我尝试了一些东西。
 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 ... 
            }
        }
    }