-1

次から文字列出力を取得していません。

構造体 stringItem {
    int レン;
    char str[1];
}

void allocationStringBuffer (char* stringContent, struct stringItem *string) {

    // dynamically sized object
    int n;
    n = strlen(stringContent);

    //struct stringItem *string = malloc(sizeof(struct stringItem) + n);
    string = malloc(sizeof(struct stringItem) + n);

    if (string == NULL) {             // check if malloc is successful
       printf("Memory allocation for string fails.\n");
       // exit(-1);
    }   

   strcpy(string->str, stringContent);
   printf("Struct string: %s\n", string->str);
   string->len = n;     
}

主に:

struct stringItem *string2;

allocationStringBuffer ("helloWorld", string2);

printf("Struct string: %s\n", (*string2).str);
free(string2);

allocationStringBuffer ("another Statement...", string2);
printf("Struct string: %s\n", string2->str);
free(string2);

結果は次のとおりです。

構造文字列: helloWorld
構造体文字列: ÉÉÉÉÉï Uï∞â∞¶SVWh♦☺
構造体文字列: 別のステートメント...
構造体文字列: ÉÉÉÉÉï Uï∞â∞¶SVWh♦☺

ご協力ありがとうございました。

[ALLのおかげで更新]
これが完全な作業コードです。解決済みです。皆さんありがとうございます。

構造体 stringItem {
    int レン;
    char str[1];
};


void allocationStringBuffer (char* stringContent, struct stringItem** pstring) {

    // 動的サイズのオブジェクト
    int n;
    n = strlen(stringContent);

    struct stringItem *string;
    string = malloc(sizeof(struct stringItem) + (n+1));

    if (string == NULL) { // malloc が成功したかどうかを確認します
       printf("文字列のメモリ割り当てに失敗しました。\n");
       // 終了(-1);
    }   

   strcpy(string->str, stringContent);
   printf("構造体文字列: %s\n", string->str);
   string->len = n;     

   *pstring = 文字列; // 割り当てられたポインタを出力パラメータにコピーします。
}


主に

struct stringItem *string2; allocationStringBuffer ("helloWorld", &string2); printf("構造体文字列: %s\n", (*string2).str); 無料 (文字列 2); allocationStringBuffer ("別のステートメント...", &string2); printf("構造体文字列: %s\n", string2->str); 無料 (文字列 2);
4

4 に答える 4

3

これらの変更を加える必要があるように私には思えます:

allocationStringBuffer ("helloWorld", &string2);  // Pass ADDRESS of string2, not just string2

void allocationStringBuffer (char* stringContent, struct stringItem **pstring)
{
    // dynamically sized object
    int n;
    n = strlen(stringContent);

    struct stringItem* string;  // Local variable, will be later copied to function parameter.
    string = malloc(sizeof(struct stringItem) + n);

    if (string == NULL) {             // check if malloc is successful
       printf("Memory allocation for string fails.\n");
       // exit(-1);
    }   

   strcpy(string->str, stringContent);
   printf("Struct string: %s\n", string->str);
   string->len = n;     

   *pstring = string;  // Copy allocated pointer to out-parameter.
}
于 2013-10-30T16:03:24.273 に答える
0

これは正しくないようです:

string = malloc(sizeof(struct stringItem) + n);

ここで何をしようとしていますか?stringの要素ですstruct stringItem。だから私はあなたがちょうど割り当てる必要があると思いますstring = malloc(sizeof(struct stringItem));

p/s: 構造体 stringItem の宣言も投稿すると良いはずです

于 2013-10-30T16:22:56.490 に答える
0

stringItem へのポインターを関数に渡し、からの戻り値でパラメーターを上書きしmalloc、それをドロップしてメモリをリークしています。これを解決するには、次の 2 つのオプションがあります。

void allocationStringBuffer(char* stringContent, struct stringItem** string) {
    int length = strlen(stringContent);
    *string = malloc(sizeof(struct stringItem) + length + 1);
    /* The +1 is padding.  You do want that. */
    strcpy(*string->str, stringContent);
}

また:

struct stringItem* allocationStringBuffer(char* stringContent) {
    int length = strlen(stringContent);
    struct stringItem* string = malloc(sizeof(struct stringItem) + length + 1);
    strcpy(string->str, stringContent);
    return string;
}

malloc基本的に、何らかの方法でポインタを返す必要があります。stringItemあなたがやっているように、スタック(つまりローカル変数)へのポインタを送ることはできません。

于 2013-10-30T16:06:20.383 に答える
0

malloc呼び出しに終端の null 文字がありません。

string = malloc(sizeof(struct stringItem) + (n + 1));

strlenは、終端の null 文字を含まないサイズを提供します。

よろしく、

于 2013-10-30T16:00:52.237 に答える