gpt4 book ai didi

c - "Walking"C 中的缓冲区

转载 作者:行者123 更新时间:2023-11-30 18:12:02 26 4
gpt4 key购买 nike

我不确定这种方法在 C 中是否正确(详细为 Atmel xmega 的 avrgcc)。数据是 ASCII 字符串。

#define BUFFER_SIZE 64
char dataBuffer[2 * BUFFER_SIZE];
char pageBuffer[BUFFER_SIZE];

void addLine(char *line) {
strcat(dataBuffer, line);
if (strlen(dataBuffer) > BUFFER_SIZE) {
strncpy(pageBuffer, dataBuffer, BUFFER_SIZE);
// <----
dataBuffer = &dataBuffer[BUFFER_SIZE];
// ---->
}
// do something other
}

目标是将 BUFFER_SIZE 字节从 dataBuffer 精确复制到 pageBuffer 并将剩余字节保留在第一个字节中。

我担心内存力。最初,编译器在一个地址上分配 2 * BUFFER_SIZE 字节。但是当我更改第一个位置的指针时会发生什么?我打赌我不能超出数组的原始边界。

我知道的唯一其他方法是循环缓冲区,但这意味着使用开始和结束指针,并且我无法使用字符串函数(由于环绕)。没什么大不了的...但只有在需要时我才想遵循这种方式。

编辑

因为我似乎没有很好地解释我的目标,所以我尝试用不同的词语重复它。

假设您要对闪存中的页面进行编程。该页面的大小为 BUFFER_SIZE 字节。您收到一些不同长度的数据(尽管短于 BUFFER_SIZE)。因此,您希望存储接收到的数据(dataBuffer),直到达到页面的大小。

此时,您希望将前 BUFFER_SIZE 字节移出到 pageBuffer,这是要存储到内存中的数组。然后您要继续连接新收到的字符串,直到再次达到页面大小并重新启动。

这段代码似乎有效:

#define PAGE_SIZE       256

char lineBuffer[2 * PAGE_SIZE + 1];
char pageBuffer[PAGE_SIZE + 1];

void appendLine(char *line) {
strcat(lineBuffer, line);
if (strlen(lineBuffer) > PAGE_SIZE) {
strncpy(pageBuffer, lineBuffer, PAGE_SIZE);
char foo[PAGE_SIZE + 1];
strcpy(foo, lineBuffer + PAGE_SIZE);
strcpy(lineBuffer, foo);
// use pageBuffer
strcpy(pageBuffer, "");
}
}

最佳答案

我不确定您到底想要实现什么,但发布的代码无法编译。

不允许更改dataBuffer的值,即这是非法的:

dataBuffer = &dataBuffer[BUFFER_SIZE];

// Compile error: assignment to expression with array type

我认为你应该使用memcpy来代替。喜欢:

#define BUFFER_SIZE 64
char dataBuffer[2 * BUFFER_SIZE];
char pageBuffer[BUFFER_SIZE];

void addLine(char *line) {
strcat(dataBuffer, line);
if (strlen(dataBuffer) > BUFFER_SIZE) {
memcpy(pageBuffer, dataBuffer, BUFFER_SIZE);
// <----
memcpy(dataBuffer, dataBuffer + BUFFER_SIZE, BUFFER_SIZE);
// ---->
}
// do something other
}

此外,您应该在执行 strcat 之前检查缓冲区溢出

喜欢:

if (strlen(dataBuffer) + strlen(dataBuffer) >= BUFFER_SIZE)
{
// Error handling
}

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com