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)等声明之间的区别属于头文件(.h扩展名)并告诉编译器如何在另一个模块中定义函数的代码>,以及属于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 ...
}
}
}