2011-12-16 34 views
0

私はCプログラムでRedisを使用しています(hiredis Cバインディングを使用しています)。 xxxは(バイナリデータ)512バイト長であり、SET asdf xxx:あなたが見ることができるようにRedis:データが改行文字で始まる場合のSETコマンド

void insert(redisContext* c,char* buf){ 
     static redisReply *reply; 
     const char* hash="asdf"; 
     char* cmd=(char*)malloc((strlen("SET ")+strlen(hash)+strlen(" ")+CHUNKSIZE)*sizeof(char)); 

     //hash=getHash(buf); 
     memcpy(cmd,"SET ",(size_t)strlen("SET ")); 
     memcpy(cmd+strlen("SET "),hash,(size_t)strlen(hash)); 
     memcpy(cmd+strlen("SET ")+strlen(hash)," ",(size_t)strlen(" ")); 
     memcpy(cmd+strlen("SET ")+strlen(hash)+strlen(" "),buf,(size_t)CHUNKSIZE); 

     fwrite(cmd,strlen("SET ")+strlen(hash)+strlen(" ")+CHUNKSIZE,sizeof(char),stdout); 
     printf("\n\n\n\n\n\n"); 
     reply=(redisReply*)redisCommand(c,cmd); 
     freeReplyObject(reply); 

     free(cmd); 
} 

は、cmdが次のようになります。

は、ここに私のコードです。

問題は、バイナリデータ文字列が '\ n'で始まる場合に発生します。私はエラー(セグメンテーションエラー)を取得し続けます。

誰もが考えている?事前に

多くのおかげで、

答えて

1

私はあなたが投稿し、任意のクラッシュを取得していないコードを使用しています。 私のコードは次のとおりです。

#define CHUNKSIZE 512 
char asd[CHUNKSIZE]; 
memset(asd, 0, 512); 
asd[0] = '\n'; 
insert(c, asd); 

は、おそらくあなたにそれがクラッシュする前に、間違っているものの良いアイデアを与えることvalgrindを使用してアプリケーションを実行してみてください。

+0

どうもありがとうございました:一緒に文字列へのポインタで、それは文字列のsize_tの長さ引数が必要です。それは明らかに別のエラーです。とても有難い、 – Eamorr

1

hiredisドキュメント:

コマンドでバイナリセーフ文字列を渡す必要がある場合は、%bの指定子は使用することができます。フィードバックのための

reply = redisCommand(context, "SET foo %b", value, valuelen); 
関連する問題