0

私はこのサイトを初めて使用するので、この最初の投稿で何か問題がありましたら、お詫び申し上げます。私がコードを書いた方法 (再利用性のために作成されたコードを含む) では、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";

助けてくれてありがとう!

4

1 に答える 1