我是这个网站的新手,所以如果我在第一篇文章中做错了什么,我深表歉意。我编写代码的方式(包括为可重用性而编写的代码),我必须使用 char* 数组。我正在将传入的 char* 转换为所有小写字母。我面临的问题涉及我释放 newString2。因为我将它分配给我的newString,所以释放它肯定会丢失我分配给newString 的信息,从而丢失分配给convertedKey 的数据。我在寻找如何成功释放分配的内存方面陷入困境,但也通过我的函数参数返回转换后的字符串的数据。那可能吗?以下是我当前转换为小写的函数。我对 strdup 也很陌生,所以我确定我没有给它任何正义。
void convertKeyCasing (ListElementPtr key, ListElement *convertedKey)
{
ListElementPtr newString = (ListElementPtr) malloc (sizeof (ListElement));
int i = 0;
char ch;
char *string = key->data.key.key;
char *newString1 = strdup (string);
while (isalpha (key->data.key.key[i]) != false)
{
ch = tolower(key->data.key.key[i]);
newString1[i] = ch;
++i;
}
char* newString2 = strdup (newString1);
newString->data.key.key = newString2;
*convertedKey = *newString;
key = convertedKey;
free(newString2);
free (newString1);
free (newString);
}
我在列表中的结构包括:
typedef struct KEY_DATATYPE
{
char* key;
int length;
}KEY_DATATYPE;
typedef struct DATATYPE
{
Q_DATATYPE data;
KEY_DATATYPE key;
// maintained so that it still works with list
union
{
char charValue;
unsigned int intValue;
float floatValue;
};
unsigned short whichOne;
} DATATYPE;
typedef struct ListElement* ListElementPtr;
typedef struct ListElement
{
DATATYPE data;
ListElementPtr psNext;
ListElementPtr psPrev;
} ListElement;
在我的驱动程序中,我正在创建一个 ListElementPtr 并为其分配一个键值,例如,
ListElementPtr listPtr;
listPtr->data.key.key = "Hello";
再次感谢您的帮助!