gpt4 book ai didi

C 运行时错误 : Dynamically Allocating Memory in a For Loop

转载 作者:行者123 更新时间:2023-11-30 20:35:47 25 4
gpt4 key购买 nike

我正在发布我的问题的延续 this thread .

我正在尝试创建一个以 '!' 开头的字符串并添加从传感器读取的 6 个值(用逗号分隔),然后通过串行端口发送。示例输出为:"!5,5,5,5,5,5""!34,34,34,34,34,34" .

我的代码大部分都可以工作;我可以通过串行端口发送一个模拟传感器的值 !215!215!215例如,但是当我取消注释 for loop 时下面的代码我在串行端口上看不到任何东西,并且由于缺乏更好的词,该程序似乎毫无用处。

我的 for 循环中似乎发生了运行时错误,但我无法确定它发生在哪里。 为什么下面的代码在不使用 for 循环的情况下成功为一个模拟传感器发送串行数据,而在使用 for 循环时什么也不发送?我如何调整我的代码以实现我想要的输出?

char* convertIntToString(uint8_t integerValue, char* str){
utoa(integerValue, str, 10);
return str;
}

char* concat(char *s1, char *s2)
{
char *result = malloc(strlen(s1)+strlen(s2)+1);
strcpy(result, s1);
strcat(result, s2);
return result;
}


int main(void){
uint8_t analogValue;
char *outputStr = malloc(1);

while (1) {
outputStr = realloc(outputStr, 2);
strcpy(outputStr, "!");
analogValue = ReadADC(0);
char str[4];
outputStr = concat(outputStr, convertIntToString(analogValue, str));

//RUNTIME ERROR IN THIS LOOP
for(int i = 0; i < 5; i++){
char* newStr = concat(outputStr, ",");
// free the old memory before using the new memory
free(outputStr);
outputStr = newStr;
newStr = concat(outputStr, convertIntToString(analogValue, str));
// free the old memory before using the new memory
free(outputStr);
outputStr = newStr;
}

CDC_Device_SendString(&VirtualSerial_CDC_Interface, outputStr); //send sring over serial port
free(outputStr);
}
}

最佳答案

从上面的评论和上一个问题中的评论进行扩展。

如果您能够计算“数据包”的最大大小,那么您可以完全避免动态内存,而只使用固定的缓冲区大小。计算甚至不必 100% 准确,只要它犯“太大”的错误即可。

例如:5 个数字的 5 个实例,最多 3 位数字,以逗号分隔:5 * 5 * 4(3 位数字 + 逗号)。不是 100% 正确,因为第五组不需要逗号,所以你高估了 1(或者是 5?)。如果您有多个“已知错误”,请注意此操作可能产生的累积影响。

因此,假设您可以估计最大大小,也许可以通过#defines对其进行“编码” - 甚至可能修复一些“已知错误”)。

现在你有了char buffer[KNOWN_UPPER_BOUND],只要正确初始化它(例如buffer[0] = '\0';,你就可以通过 strcat() 继续附加到它。如果您正在谈论大数字,您可以跟踪最后一个索引,以避免重复扫描字符串以查找结尾。例如(为了简单起见,使用全局变量)

char buffer[KNOWN_UPPER_BOUND];
int last_index=0;

addString(char* str)
{
int len = strlen(str);
if (last_index + len > KNOWN_UPPER_BOUND)
{
/* error handling */
}
else
{
strcat(buffer[last_index], str);
last_index += n;
}
}

那么动态代码存在哪些问题?

  • 潜在的泄漏(很像我在计算中提到的错误 - 好的(我的意思是“在小程序中不会造成太大危害”)如果您泄漏 2 个字节一次,那么当您将其放入循环中时就不那么好了并一遍又一遍地泄漏 2 个字节)
  • 速度问题 - malloc 不受您控制,它可能会非常慢。许多小的分配可能会产生内存碎片,这可能意味着稍后当您想要更大的 block 时您将无法获得。
  • 大量复制和重新复制数据。您的 concat 是一个示例 - 每个 concat 都会执行 malloc 并复制两个字符串。每次你调用它。

您仍然可以使用动态内存来保存最终字符串,但在固定大小的缓冲区中构建每个“组件”。

关于C 运行时错误 : Dynamically Allocating Memory in a For Loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37935102/

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