2016-10-06 5 views
0

ファイルから情報を読み込み、各行の構造体にメモリを割り当て、その構造体に情報を埋め込むプログラムを作成しています。構造体へのポインタは、グローバル配列に配置されます。構造体配列に新しいエントリを追加すると最後のすべてのエントリがオーバーライドされます

ファイル内のすべての行(最初の行を除く)は、 'Unsigned Char - Char - Unsigned Char - Char []'の形式です。

私の問題は、新しい構造体を追加するたびに、他のすべての構造体のChar []が上書きされるということです。

は、私は次のファイルがあるとしましょう:

1 10 6 first 
2 12 7 second 
3 15 6 third 

私は、そのファイルと私のプログラムを実行し、グローバル配列を印刷するとき、それは、このような出力が得られます。

ID: 1 | FLAGG: 10 | STR_LEN: 6 | MODELL: third 
ID: 2 | FLAGG: 12 | STR_LEN: 7 | MODELL: third 
ID: 3 | FLAGG: 15 | STR_LEN: 6 | MODELL: third 

の代わりに、予想:

ID: 1 | FLAGG: 10 | STR_LEN: 6 | MODELL: first 
ID: 2 | FLAGG: 12 | STR_LEN: 7 | MODELL: second 
ID: 3 | FLAGG: 15 | STR_LEN: 6 | MODELL: third 

コード:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MAX_LENGTH 256 

struct myStruct* globarlArray[MAX_LENGTH] 

struct mySTruct{ 
    unsigned char ID; 
    char FLAGG; 
    unsigned char str_len; 
    char* modell; 
}; 

int set_variables(struct myStruct* s, unsigned char new_ID, char new_FLAGG, unsigned char new_str_len, char* new_modell){ 
    s->ID = new_ID; 
    s->FLAGG = new_FLAGG; 
    s->str_len = new_str_len; 
    s->modell = new_modell; 
    return 0; 
} 
int main(int argc, char* argv[]){ 
    //Read from file 
    ... 
    //Initialize structs, add variables to struct, and add struct to global array 
    unsigned char ID; 
    int ID_INT; 
    char FLAGG; 
    unsigned char str_len; 
    char modell[253]; 
    char* tempstr; 

    for (i = 1; i < lines; i++){ 
     tempstr = str[i]; //str[1] is first line of into from file, str[2] is second line,... 
     Ruter_ID = tempstr[0]; 
     Ruter_ID_INT = Ruter_ID; 
     FLAGG = tempstr[1]; 
     str_len = tempstr[2]; 
     sprintf(modell, "%s", tempstr+3); 
     struct myStruct *line = (struct myStruct*)malloc(sizeof(struct myStruct)); 
     set_vars(line, ID, FLAGG, str_len, modell); 
     globalArray[ID_INT] = line; 
    } 
    //print array 
    for (i = 0; globalArray[i] != NULL; i++){ 
     printf("ID: %d | FLAGG: %d | str_len: %d | Modell: %s", 
     globalArray[i]->ID, globalArray[i]->FLAGG, globalArray[i]->str_len, 
     globalArray[i]->modell); 
    } 
    //Some more code 
    ... 
} 

ありがとうございます!

+0

コンパイルする実際のコードを投稿してください –

+2

あなたは1つのcharバッファ 'char modell [253];'しか持っていません。あなたのコードは 's-> modell'をすべてこの同じバッファを指し示します。 –

+0

あなたはポインタを理解していますか? – immibis

答えて

0

modellアレイが何度も使用されています。同じ構造のメモリが、それぞれの構造体によってポイントされています。それぞれの構造体に文字列のコピーを渡す必要があります(おそらくstrcpy()または関連する関数を使用します)。構造体を解放するときにそのコピーのメモリを解放することについても心配する必要があります。

1

私の問題は、私は新しい構造体を追加するたびに、シャアは[]他のすべての構造体が上書きしていることである

使用しているので、たまたま

は:。

set_vars(line, ID, FLAGG, str_len, modell); 

modellが配列でありますあなたはストーリーですg myStructのすべてのインスタンスでその配列の最初の要素へのポインタ。

myStructのすべてのインスタンスにメモリを割り当てて、そのポインタを格納する必要があります。

char* copy = strdup(modell); 
    set_vars(line, ID, FLAGG, str_len, copy); 

次に、コピーが割り当て解除されていることを確認する必要があります。


strdup標準ライブラリ関数ではありませんが、それを容易に実現することができます。

関連する問題