2

何が間違っているのかわかりません。これが明らかに間違っている場合は申し訳ありませんが、uthash を使用して株式とその価格のハッシュ マップを作成しようとしています。しかし、ハッシュ マップに株を追加すると、上記のエラーが発生します。

私がしたことは、彼らのサイトから例を取り出して実行し、それが機能することを確認することでした。期待どおりに機能したら、問題に合わせて値を変更しました。元のコードではid、構造体の変数は整数でしたが、それを char に変更しました (数字の代わりに、株式ティッカーをキーとして使用したかったのです)。その後、次のエラーが発生し始めました。

../src/stackCsamples.c:87: warning: passing argument 1 of '__builtin_object_size' makes pointer from integer without a cast
../src/stackCsamples.c:87: warning: passing argument 1 of '__builtin_object_size' makes pointer from integer without a cast
../src/stackCsamples.c:87: warning: passing argument 1 of '__builtin___strcpy_chk' makes pointer from integer without a cast
../src/stackCsamples.c:87: warning: passing argument 1 of '__inline_strcpy_chk' makes pointer from integer without a cast
../src/stackCsamples.c:89: warning: passing argument 1 of 'strlen' makes pointer from integer without a cast
../src/stackCsamples.c:89: warning: passing argument 1 of 'strlen' makes pointer from integer without a cast
../src/stackCsamples.c:89: warning: passing argument 1 of 'strlen' makes pointer from integer without a cast

問題は、ここ(87)strcpy(s->id, user_id);と(89)の2行にあるようです:HASH_ADD_STR( users, id, s );

これらの両方をどのように間違って使用していますか? strcpy を調べたところ、3 つのアイテムが必要なように見えますが、サイズを追加してもエラーが発生します。

関連があると思われる部分の抜粋を次に示します。

#include <stdio.h>   /* gets */
#include <stdlib.h>  /* atoi, malloc */
#include <string.h>  /* strcpy */
#include "uthash.h"

struct my_struct {
    char id;                    /* key */
    float price;
    UT_hash_handle hh;         /* makes this structure hashable */
};

struct my_struct *users = NULL;

void new_stock(char *user_id, float price) {
    struct my_struct *s;

    s = (struct my_struct*)malloc(sizeof(struct my_struct));
    strcpy(s->id, user_id);
    s->price = price;
    HASH_ADD_STR( users, id, s );  /* id: name of key field */
}

int main() {
    printf("starting..");
    new_stock("IBM", 10.2);
    new_stock("goog", 2.2);
    return 0;
}
4

2 に答える 2

3

この行で:

strcpy(s->id, user_id);

文字列を文字にコピーしようとしています。strcpy への両方の引数がchars: へのポインタchar *であることに注意してください。

char[]さらに、メモリ内に s->id 用のスペースを aまたは aとして作成する必要があることに注意してくださいchar *。ヒント: 構造体用のスペースを作成しましたが、これにid.

C を使用したい場合は、K&Rのコピーを入手する必要がありますが、そうでない場合は、これを確認するのに時間がかかる場合があります

于 2012-06-05T03:04:04.347 に答える
1

構造体にユーザーID配列用の十分なスペースを提供するか、十分なスペースを動的に割り当てる必要があります。たとえば、次のようにします。

enum { MAX_ID_LEN = 32 };
struct my_struct
{
    char id[MAX_ID_LEN];                    /* key */
    float price;
    UT_hash_handle hh;         /* makes this structure hashable */
};

次に、次を使用できます。

strcpy(s->id, user_id);

user_id31文字以内で、事前にnullを加えたものであることを確認した場合に限ります。そのチェックを行っていない場合は、行う必要があります。そのチェックを拒否し、長すぎるユーザーID文字列を切り捨ててもかまわない場合は、次を使用できます。

strncpy(s->id, user_id, sizeof(s->id) - 1);
s->id[sizeof(s->id)-1] = '\0';

これにより、ヌル終了が保証されます。単独で使用するstrncpy()だけではありません。文字列(s->id)がはるかに長い場合は、コードが文字列の末尾をゼロにするのに時間を浪費していることに注意してください。


に関する残りの警告はマクロstrlen()によって隠されていますが、警告HASH_ADD_STR()と同じ問題が原因である可能性があります。フィールドは文字ポインタまたは文字配列ではありませんでした。修正された構造は、これらの警告も破棄する可能性があります。確かに、その定義とそれが呼び出すマクロを表示する必要があります。strcpy()s->idHASH_ADD_STR()

于 2012-06-05T03:12:19.767 に答える