構造体の配列を作成する方法を知っていますが、サイズは事前定義されています。しかし、配列が大きくなるような構造体の動的配列を作成する方法はありますか?
例えば:
typedef struct
{
char *str;
} words;
main()
{
words x[100]; // I do not want to use this, I want to dynamic increase the size of the array as data comes in.
}
これは可能ですか?
私はこれを研究しました:words* array = (words*)malloc(sizeof(words) * 100);
100 を取り除き、入ってくるデータを保存したいです。したがって、76 フィールドのデータが入ってくる場合、100 ではなく 76 を保存したいと思います。どのくらいのデータが入ってくるかわからないと仮定しています。私のプログラムに。上で定義した構造体では、最初の「インデックス」を次のように作成できます。
words* array = (words*)malloc(sizeof(words));
ただし、後で配列に要素を動的に追加したいと考えています。問題の領域を十分に明確に説明したことを願っています。主な課題は、2 番目のフィールドを動的に追加することです。少なくとも、それが当面の課題です。
しかし、私は少し進歩しました:
typedef struct {
char *str;
} words;
// Allocate first string.
words x = (words) malloc(sizeof(words));
x[0].str = "john";
// Allocate second string.
x=(words*) realloc(x, sizeof(words));
x[1].FirstName = "bob";
// printf second string.
printf("%s", x[1].str); --> This is working, it's printing out bob.
free(x); // Free up memory.
printf("%s", x[1].str); --> Not working since its still printing out BOB even though I freed up memory. What is wrong?
私はいくつかのエラーチェックを行い、これが私が見つけたものです。x のメモリを解放した後、次を追加します。
x=NULL;
次に、 x を印刷しようとすると、必要なエラーが発生します。少なくとも私のコンパイラでは、 free 関数が機能していないということですか? 私はDevCを使用していますか??
ありがとう、私は今理解しました:
FirstName は、malloc によって割り当てられていない char の配列へのポインターです。ポインターのみが割り当てられており、free を呼び出した後、メモリは消去されず、ヒープで利用可能であるとマークされます。後で書きます。– マット・スミス
アップデート
モジュール化して、構造体の配列の作成を関数に入れようとしていますが、何も機能していないようです。私は非常に単純なことをしようとしていますが、他に何をすべきかわかりません。これは前と同じ行に沿っており、データをロードしている別の関数 loaddata と、印刷を行う必要があるメソッドの外にあります。どうすればそれを機能させることができますか?私のコードは次のとおりです。
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
typedef struct
{
char *str1;
char *str2;
} words;
void LoadData(words *, int *);
main()
{
words *x;
int num;
LoadData(&x, &num);
printf("%s %s", x[0].str1, x[0].str2);
printf("%s %s", x[1].str1, x[1].str2);
getch();
}//
void LoadData(words *x, int * num)
{
x = (words*) malloc(sizeof(words));
x[0].str1 = "johnnie\0";
x[0].str2 = "krapson\0";
x = (words*) realloc(x, sizeof(words)*2);
x[1].str1 = "bob\0";
x[1].str2 = "marley\0";
*num=*num+1;
}//
この単純なテスト コードがクラッシュしており、その理由がわかりません。バグはどこですか?