我是這個網站的新手,所以我非常抱歉,如果我在第一篇文章中做了任何錯誤的話。 我寫過代碼的方式(包括爲可重用性設計的代碼),我必須使用char *數組。我將傳入的char *轉換爲所有小寫字母。我面臨的問題涉及我釋放newString2。因爲我將它分配給我的newString,釋放它肯定會丟失我分配給newString的信息,從而丟失分配給convertedKey的數據。我在找出如何成功釋放分配的內存的空洞,但也通過我的函數參數返回轉換的字符串的數據。那可能嗎? 以下是我目前用於轉換爲小寫的功能。我對strdup也很陌生,所以我相信我沒有給出任何正義。通過函數參數返回一個指針,但丟失了分配給它的數據。 (In C)
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";
謝謝再次尋求幫助!
相關:沒有什麼特別的三分球,使他們的例外傳遞的地址口頭禪爲C. out參數如果你需要傳遞的東西地址來修改調用者端,那麼這正是你所做的:傳遞地址並使參數成爲基礎數據類型的正式指針類型。在這種情況下,你需要一個* pointer-to-pointer *。 I.e'ListElementPtr * key'。我敢肯定,這是多次複製作爲重複的問題,一旦我找到一個,我會鏈接它。 – WhozCraig
@DavidHeffernan非常感謝您的反饋。我目前正在測試這個代碼,而且我確實看到了泄漏的內存。我現在是學習C的學生,所以我非常感謝你回覆。我將刪除這個函數,進行研究並重新嘗試。 – user3040968
@WhozCraig非常感謝您的反饋。我將嘗試使用**的新功能。你的回答確實幫了很大忙。再次感謝。 – user3040968