2012-06-05 135 views
1

我無法弄清楚我做錯了什麼。我正在學習C,所以很抱歉,如果這顯然是錯誤的,但我試圖用uthash來製作股票及其價格的散列圖。但是當我將股票添加到我的散列圖時,出現上述錯誤。使整數指針沒有使用strcpy強制轉換

我所做的就是從他們的網站中拿出例子,並運行它來確保它能夠正常工作,一旦它按預期工作,我就改變了值以適應我的問題。在原始代碼中,結構體中的變量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),它是: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; 
} 
+0

什麼是'user_id'?它是如何定義的?另外'HASH_ADD_STR'是如何定義的? –

+0

@Als對不起,我不明白,我認爲在這種情況下,user_id只是我傳遞給函數的變量的名稱,在這種情況下,它是「IBM」還是「good」?我認爲'HASH_ADD_STR'是uthash包含的一個宏。它最初是HASH_ADD_INT,但我將其更改爲str,因爲我的主鍵不是int。 –

+0

'strcpy'在目的地址和源字符串的地址中,該函數假設目的地足夠大以容納字符串。在你的情況下,目的地是一個「字符」,而源可能是一個字符串,你不能複製一個字符串到一個char,char('1 byte')中沒有足夠的內存來存放一個字符串。你可以將一個字符賦值給另一個,而不需要複製。 –

回答

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_id不超過31個字符加上空的前手。如果你還沒有做這個檢查,你應該。如果你拒絕做檢查和不介意截斷超長用戶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->id場不是一個字符指針或字符數組。修改後的結構也可能會消除這些警告。對於我們來說,您必須展示HASH_ADD_STR()的定義以及它調用的任何宏。

+0

啊..我改變了大小,它的工作。對不起,我一直在用整數工作,從來沒有字符,我只是(錯誤地)認爲C接受了我發送的任何大小。我做到了,一切正常!我會像你剛纔提到的那樣查看字符串。 –

3

這一行:

strcpy(s->id, user_id); 

您試圖將一個字符串複製到一個字符。請注意,strcpy的兩個參數都是指針轉換爲字符:char *

此外,請注意,您還需要在內存中爲s-> id製作一些空間,例如char[]char *。提示:您已爲結構騰出空間,但只包含單個字符的足夠空間,用於id

如果你想使用C,那麼你應該得到K&R的副本,但如果沒有這樣做,你可能會花一些時間審查this

+0

嗯..我應該使用strcpy然後在我的情況?當我嘗試's-> id = user_id;'我仍然得到相同的錯誤。 –

+0

你應該更喜歡['strncpy'](http://stackoverflow.com/questions/1258550/why-should-you-use-strncpy-instead-of-strcpy),這是你可能一直在評論的版本接受3個參數,但您需要了解C如何首先處理字符串。 – pb2q

相關問題