私はここでドイツ語がとても新しいので、ここで私の悪い英語をお許しください。 学校の練習の一環として、UNIXベースのシステムで実行されるキーバリューストア用の共有メモリを持つソケットサーバーを実装することになっています。サーバ、共有メモリ、fork()が動作しています。我々は構造体の配列を使用し、これに対して関数を作った(put、get、delete)。 putメソッドでは、2つの文字列をコピーするときにこのBAD_ACCESSを取得します。この方法の コードは以下の通りです、私たちのリポジトリへのリンクはこちらです:Github RepoBAD_ACCESS with strcpy with shared memory(C)
int put(int key, char *value, char *resp){
int emptyIndex = -1;
//strcpy(resp, "");
resp = "";
for(int i = 0; i < STORELENGTH; i++){
// If the key exists, overwrite it, give back previous value, and return true
if(kv[i].key == key) {
resp = kv[i].value;
kv[i].value = value;
return 1;
}
// If the key doesn't exist, remember the empty index
if(kv[i].key == NULL){
emptyIndex = i;
}
}
// If there was an empty index, just reuse it
if(emptyIndex > -1) {
kv[emptyIndex].key = key;
resp = "";
kv[emptyIndex].value = value;
return 1;
}
*resp = (char) "Error: Put was not successful.";
return -1;
}
見ての通りプログラムの開発はすぐに作業を停止したため、strcpyの-機能は、コメントです。
char *resp = ""; <- This one is bad
//char resp[BUFSIZ]; <-- This one is good but commented.
を使用すると、文字であることresp
を持っている結果*:あなたの助けを おかげで、 アレックス
あなたは '* RESP =(文字)をどう思います「エラー:。入れは成功しませんでしたが、」'成し遂げるでしょうか?そのキャストは、あなたが何か間違っているというヒントになるはずです。ちょうどブラインドキャストでコンパイラの警告を止めないでください。 –
あなたの問題は、* 'resp'ですか?あなたは何を関数に渡しますか?どのように呼びますか?あなたは、[最小、完全で、かつ実証可能な例](http://stackoverflow.com/help/mcve)を作成して私たちを見せてください。 –
Cのパラメータは、参照ではなく値によって渡されます。直後に戻ると、 'resp'に新しい値を代入するのは無意味です。あなたは、「休む」の目的が混乱しているようです。 –