さて、ここに何が起こっているかの要点があります:
(char[x])
引数が文字ポインタとして定義されている関数に文字配列を渡します(char *)
。関数内に入ると、別の文字ポインターを割り当てます(これは私が持っている構造体の一部です)。構造体の文字ポインタに着信引数を割り当てるとすぐに、セグメンテーション違反が発生します。そのような。
temp->name = (char*)malloc(sizeof(char));
temp->name = name;
これは私が以前に関数を利用していた方法です:
char *name = "HEY";
Function(name);
これが私がエラーでそれをどのように利用しているかです:
char name[3] = "HEY";
Function(name);
上記と同じステートメントで、正常に動作します。名前を定数「HEY」に変更し、同じ入力ですべてがスムーズに進むようにして、他に何もないことを確認しました。
誰かが頭のてっぺんから離れた理由を考えることができれば、私は助けていただければ幸いです。ありがとうございました!
これが完全な関数です:
- openListは、構造体のリンクリストの先頭へのポインタです。
- tempOpenは、openListの位置を変更せずに、リストを精査するために使用できる一時的なポインターです。
- findOpenSetSID / findItem->SID/キーを介してリンクリストで構造体を検索します
- answerOpen / answerItem-> 1 ==最初のノード、2 ==他のノード、0=見つかりません
これは、関連する構造の簡単な要約です。 オープン構造は、別の構造(セット構造と呼ばれる)へのポインターのリンクリストです。セット構造は、名前、sid、およびアイテム構造のリンクリストです。アイテム構造は、データとキーのリンクリストです。
Error_t WRITE(Sid_t sid, char *key, char *data){
Open_p_t tempOpen = openList; //setting a pointer to a struct
int answerOpen = findOpenSetSID(sid, &tempOpen);
if(answerOpen > 0){
Set_p_t targetNode;
if(answerOpen == 1){
targetNode = tempOpen->file;
}
else{
targetNode= tempOpen->next->file;
}
Item_p_t tempItem = targetNode->items;
int answerItem = findItem(key, &tempItem);
Item_p_t targetItem;
targetItem = (Item_p_t)malloc(sizeof(Item_t));
if(answerItem > 0){
if(answerItem == 1){
targetItem = targetNode->items;
}
else{
targetItem = targetNode->items->next;
}
targetItem->data = data;
}
else{
**targetItem->data = data;** <<<The problem line.
basically I am just adding
items to my sets. But this line
freaks out when the input changes
from char* to char[]
targetItem->key = key;
targetItem->next = targetNode->items;
targetNode->items = targetItem;
}
return 0;
}
return 1;
}
入力セグメントは次のとおりです。
char key[32], data[64]; // reads in data using fscanf(fd, "%s %s", key data)
then calls WRITE(setId, key, data);