2017-06-06 23 views
-3

私はここでドイツ語がとても新しいので、ここで私の悪い英語をお許しください。 学校の練習の一環として、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を持っている結果*:あなたの助けを おかげで、 アレックス

+4

あなたは '* RESP =(文字)をどう思います「エラー:。入れは成功しませんでしたが、」'成し遂げるでしょうか?そのキャストは、あなたが何か間違っているというヒントになるはずです。ちょうどブラインドキャストでコンパイラの警告を止めないでください。 –

+0

あなたの問題は、* 'resp'ですか?あなたは何を関数に渡しますか?どのように呼びますか?あなたは、[最小、完全で、かつ実証可能な例](http://stackoverflow.com/help/mcve)を作成して私たちを見せてください。 –

+1

Cのパラメータは、参照ではなく値によって渡されます。直後に戻ると、 'resp'に新しい値を代入するのは無意味です。あなたは、「休む」の目的が混乱しているようです。 –

答えて

1

RESPは、あなたのmain.cあなたが誤って初期化されている文字列でなければならないこと、と仮定すると、 strcpyは少なくとも2のサイズを必要としますが、1つは "\ 0" - 文字列終了文字をコピーします。そのため、長さが1のrespに2の長さを入れようとするとアプリがクラッシュします。あなたが所有していないメモリに書き込もうとしています。

また、代わりに:

*resp = (char) "Error: Put was not successful."; 

ます。またstrcpyを使用する必要があります。彼らはあなたに新しいしている場合はstrcpyのように、使用している優れた機能のための

2.読むのマニュアルを参照して、それを理解することが

1.リードを配列とポインタについて:私は、次のことをお勧め。それはのようないくつかの貴重な情報が含まれています

To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.

3.デバッグについて学ぶ - 私見、それは最も重要なものの一つです! たとえば、this linkには、メモリ割り当てとデバッグのテクニックのいくつかのポイントが記載されています。

すべて、これは将来的にあなたの人生を容易にすることができ:)