1

このコードを完成させようとしていますが、一時バッファの作成に行き詰まっています。これまでに学んだことはありませんが、どういうわけか自分のプログラムで使用する必要があります。

このウェブサイトから私は最良の選択だと思います

char * func1() {
     char *buffer = (char *)malloc(1000);
     buffer[0] = '\0'; // Initialize buffer
     // Do processing to fill buffer
     return buffer;
}

以下は私のコードです

 #include <stdio.h>
#include <stdlib.h>
#define LUNCHES 5
#define ARRAY 2

int main(void)
{
    int x;
    struct Food
    {
        char *name;                                                            /* “name” attribute of food */
        int weight, calories;                                                  /* “weight” and “calories” attributes of food */
    }lunch[LUNCHES] = { [0] = {"apple", 4, 100}, [1] = {"salad", 2, 80} };

    for(x = ARRAY; x < LUNCHES; ++x)
    {
        char *buff = malloc(sizeof(lunch[x].name));

        printf("Please input \"food\", weight, calories: ");
        scanf("%s", buff);
        scanf("%d %d", &lunch[x].weight, &lunch[x].calories);
        printf("The %s weighs %doz. and contains %d calories.\n", lunch[x].name, lunch[x].weight, lunch[x].calories);


    }

    return 0;
}

わかりました、それを変更しました。しかし今、出力は

NULL は重く、含まれています。なぜヌル?

修正済み

#include <stdio.h>
#include <stdlib.h>
#define LUNCHES 5
#define ARRAY 2

int main(void)
{
    int x;
    struct Food
    {
        char *name;                                                            /* “name” attribute of food */
        int weight, calories;                                                  /* “weight” and “calories” attributes of food */
    }lunch[LUNCHES] = { [0] = {"apple", 4, 100}, [1] = {"salad", 2, 80} };

    for(x = ARRAY; x < LUNCHES; x++)
    {
        lunch[x].name = malloc(25 * sizeof(char));

        printf("Please input \"food\", weight, calories: ");
        scanf("%s", lunch[x].name);
        scanf("%d %d", &lunch[x].weight, &lunch[x].calories);
        printf("The %s weighs %doz. and contains %d calories.\n\n", lunch[x].name, lunch[x].weight, lunch[x].calories);

        free(lunch[x].name);

    }

    return 0;
}
4

1 に答える 1

0

まず、 -の代わりにfor(x = ARRAY; x < LUNCHES; ++x)注意してください。そうしないと、配列がオーバーフローします(インデックスはゼロベースで、からまで実行されます)。<<=0LUNCHES-1

割り当てについて:

  • 配列内のすべてのエントリに対してバッファを作成する必要があるためlunch[]、forループでは、のようなものが必要ですlunch[x].name = malloc(SIZE)。ここSIZEで、は妥当な値です。食事名の目的では、最大80文字で十分と思われます。
  • 次に、割り当てられたポインタがではないことを確認する必要があります。これにより、メモリ不足の状態が通知されます。そうしないと、間接参照によってセグメンテーション違反が発生する可能性があります。lunch[x].nameNULL
  • 次に、(新しく割り当てられたバッファへの)ポインタをへの引数として使用できますが、割り当てられていないメモリにオーバーランしないようにscanf()、最大​​幅(つまり)を指定することを忘れないでください。SIZE-1

free()データが不要になったとき、またはプログラムの最後に、割り当てられたメモリへのポインタを使用することを忘れないでください。単純な例では、技術的には必要ありませんが、非常に悪い習慣を簡単に開始する可能性があります。

于 2012-11-12T22:07:07.123 に答える