gpt4 book ai didi

在 C : dynamically handling memory 中连接一个 char 数组

转载 作者:行者123 更新时间:2023-12-02 01:25:02 25 4
gpt4 key购买 nike

我对我在 C 程序中做错了什么感到困惑:我正在尝试创建一个以 '!' 开头的字符串,并添加从传感器读取的 6 个值(以逗号分隔),然后通过串行端口发送。示例输出为:"!5,5,5,5,5,5""!34,34,34,34,34,34"

问题:因为传感器值(上例中的 5 或 34)的范围可以从 0 到 255,所以我不知道在运行时我的 char 数组需要多大。这意味着每次我想添加到我的字符串时我都必须动态重新分配内存。下面是我这样做的尝试,但我做错了,因为我没有看到我的串口有任何反应(表明存在运行时错误)。

我如何正确地实现代码来为字符串动态分配内存?我尝试使用 mallocrealloc 的行为并不像预期。

char* convertIntToString(uint8_t integerValue){
char *str = malloc(4); //up to 3 digits + 1 for null termination
utoa(integerValue, str, 10);
return str;
}

char* concat(char *s1, char *s2)
{
char *result = malloc(strlen(s1)+strlen(s2)+1);//+1 for the zero-terminator
//in real code you would check for errors in malloc here
strcpy(result, s1);
strcat(result, s2);
return result;
}

int main(void)
{
uint8_t analogValue;
char *outputStr = malloc(1); //initalize size of char array = 1 element

while (1) {
outputStr = realloc(outputStr, 1);
outputStr = concat(outputStr, "!");
analogValue = ReadADC(0);
outputStr = concat(outputStr, convertIntToString(analogValue));
for(int i = 0; i < 5; i++){
outputStr = concat(outputStr, ",");
outputStr = concat(outputStr, convertIntToString(analogValue));
}
CDC_Device_SendString(&VirtualSerial_CDC_Interface, outputStr); //send string via USB
free(outputStr);
}
}

最佳答案

您遇到了未定义的行为,因为 outputStr 的内容在 while 循环内的第一条语句中未正确初始化。

   outputStr = realloc(outputStr, 1); // outputStr is not initialized.

将它们更改为:

    outputStr = realloc(outputStr, 2);
strcpy(outputStr, "!");

您还泄漏了一大堆内存。从 convertToString 返回的值永远不会freed。

你可以通过稍微改变策略来避免这个问题。

将函数更改为期望字符串并使用它。

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

然后,将其用法更改为:

    outputStr = concat(outputStr, convertIntToString(analogValue, str));

由于您使用 concat 的方式,您也会泄漏内存。

        outputStr = concat(outputStr, ",");

这会泄露 outputStr 的旧值。您需要将 outputStr 的旧值保留一段时间,以便您可以释放它。

这是我对 while 循环的建议:

while (1) {

outputStr = realloc(outputStr, 2);
strcpy(outputStr, "!");

analogValue = ReadADC(0);

char str[4]; // This is the max you need.
// There is no need to malloc and free.

outputStr = concat(outputStr, convertIntToString(analogValue, str));

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 string via USB
free(outputStr);
}

关于在 C : dynamically handling memory 中连接一个 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37647709/

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