0

cとポインターに問題があります。私はこれを磨き続けていますが、それは簡単でなければなりません。構造体があり、1 つの関数に割り当ててから、ポインタを元の関数に戻します。しかし、構造体の値を他の変数で埋めようとして、それらを出力またはコピーしようとすると、メモリアドレスが範囲外であるというアプリのセグメンテーション違反が発生します。

struct memcache_buffer{
        int  elements, action;
        char keys[MAX_KEYS], values[MAX_KEYS], returns[MAX_KEYS]; //action 0 = delete , 1 = get 2 = set
}memcache_buffer;

struct memcache_buffer* memcache_allocate_buffer(int size){
        struct memcache_buffer *buffer;
        buffer =malloc(sizeof(struct memcache_buffer));
        return buffer;
}

void memcache_set(char * key, char * value){
        pthread_t process_t;
        struct memcache_buffer *buffer=memcache_allocate_buffer(1);
        char keys,values;
        buffer->elements = 1;
        buffer->action=2;
        //printf("crash?\n");
        printf("%s %s",key,value);
        snprintf(buffer->keys[0],KEY_SIZE,"%s",key);
        snprintf(buffer->values[0],VALUE_SIZE,"%s",value);
        pthread_create(&process_t,NULL,memcache_process,buffer);
}

私はメモリを正しく割り当てていますか?メモリの割り当てとこれらのポインターは確かに大まかで、特に過去にphpをいじっただけです。

4

1 に答える 1

4

これがあなたの問題です:

struct memcache_buffer{
    char keys[MAX_KEYS], values[MAX_KEYS]
}

snprintf(buffer->keys[0],KEY_SIZE,"%s",key);
                     ^^^
snprintf(buffer->values[0],VALUE_SIZE,"%s",value);
                       ^^^

[0]またはを削除snprintfすると、偽の値の逆参照が試みられます。

于 2012-04-05T07:36:22.687 に答える