我无法弄清楚我做错了什么。我正在学习C很抱歉,如果这显然是错误的,但我正在尝试使用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):HASH_ADD_STR( users, id, s );
我如何使用这两种错误?我看起来很乱,看起来需要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 :(得分:3)
这一行:
strcpy(s->id, user_id);
您正在尝试将字符串复制到char上。请注意,strcpy的两个参数都是指针到chars:char *
。
此外,请注意,您还需要在内存中为s-&gt; id创建一些空格,作为char[]
或char *
。提示:你已经为结构留出了空间,但只为id
的单个字符提供了足够的空间。
答案 1 :(得分: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个字符加上空前的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->id
字段不是字符指针或字符数组。修改后的结构也可能会消除这些警告。对于我们来说,您必须显示HASH_ADD_STR()
的定义以及它调用的任何宏。