从整数生成指针,但不使用strcpy强制转换

从整数生成指针,但不使用strcpy强制转换,c,C,我不知道我做错了什么。很抱歉,如果这显然是错误的,我正在学习C语言,但我正在尝试使用它来制作股票及其价格的散列图。但是当我把股票添加到我的散列图中时,我得到了上面的错误 我所做的是从他们的网站上取一个例子,运行它以确保它工作,一旦它按预期工作,我就更改了值以适应我的问题。在原始代码中,结构中的变量id是一个整数,但我将其更改为一个字符(而不是数字,我想使用股票代码作为键),然后我开始出现以下错误: ../src/stackCsamples.c:87: warning: passing argum

我不知道我做错了什么。很抱歉,如果这显然是错误的,我正在学习C语言,但我正在尝试使用它来制作股票及其价格的散列图。但是当我把股票添加到我的散列图中时,我得到了上面的错误

我所做的是从他们的网站上取一个例子,运行它以确保它工作,一旦它按预期工作,我就更改了值以适应我的问题。在原始代码中,结构中的变量
id
是一个整数,但我将其更改为一个字符(而不是数字,我想使用股票代码作为键),然后我开始出现以下错误:

../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\u id)和(89),即:
HASH\u ADD\u STR(用户,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;
}
#include/*get*/
#包括/*atoi、malloc*/
#包括/*strcpy*/
#包括“uthash.h”
结构我的结构{
字符id;/*键*/
浮动价格;
UT_hash_handle hh;/*使此结构可哈希*/
};
struct my_struct*users=NULL;
作废新股票(字符*用户id,浮动价格){
struct my_struct*s;
s=(struct my_struct*)malloc(sizeof(struct my_struct));
strcpy(s->id,user\u id);
s->price=价格;
HASH_ADD_STR(users,id,s);/*id:键字段的名称*/
}
int main(){
printf(“开始…”);
新股票(“IBM”,10.2);
新股票(“goog”,2.2);
返回0;
}
使用此行:

strcpy(s->id, user_id);
您正在尝试将字符串复制到字符上。请注意,strcpy的两个参数都是指向char:
char*
指针

此外,请注意,您还需要在内存中为s->id留出一些空间,例如
char[]
char*
。提示:您已经为结构留出了空间,但这只包括为
id
单个字符留出了足够的空间

如果您想使用C,那么您应该获得的副本,但如果没有,您可能会花一些时间来查看。

这行代码:

strcpy(s->id, user_id);
您正在尝试将字符串复制到字符上。请注意,strcpy的两个参数都是指向char:
char*
指针

此外,请注意,您还需要在内存中为s->id留出一些空间,例如
char[]
char*
。提示:您已经为结构留出了空间,但这只包括为
id
单个字符留出了足够的空间


如果您想使用C,那么您应该获得的副本,但如果没有,您可能会花一些时间进行检查。

您需要在结构中为用户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);
strncpy(s->id, user_id, sizeof(s->id) - 1);
s->id[sizeof(s->id)-1] = '\0';
只要您检查了
user\u id
的长度不超过31个字符加上空。如果你没有做那项检查,你应该。如果您拒绝执行该检查,并且不介意截断过长的用户ID字符串,则可以使用:

strcpy(s->id, user_id);
strncpy(s->id, user_id, sizeof(s->id) - 1);
s->id[sizeof(s->id)-1] = '\0';
这确保了零终止;仅仅使用
strncpy()
是不行的。注意,如果字符串(
s->id
)长得多,您可能会发现您的代码浪费时间将字符串的末尾归零



有关
strlen()
的剩余警告由
HASH\u ADD\u STR()
宏隐藏,但可能与
strcpy()
警告的问题相同-
s->id
字段不是字符指针或字符数组。修改后的结构可能也会推翻这些警告。为了让我们确信,您必须显示
HASH\u ADD\u STR()
的定义以及它调用的任何宏。

您需要在结构中为用户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);
strncpy(s->id, user_id, sizeof(s->id) - 1);
s->id[sizeof(s->id)-1] = '\0';
只要您检查了
user\u id
的长度不超过31个字符加上空。如果你没有做那项检查,你应该。如果您拒绝执行该检查,并且不介意截断过长的用户ID字符串,则可以使用:

strcpy(s->id, user_id);
strncpy(s->id, user_id, sizeof(s->id) - 1);
s->id[sizeof(s->id)-1] = '\0';
这确保了零终止;仅仅使用
strncpy()
是不行的。注意,如果字符串(
s->id
)长得多,您可能会发现您的代码浪费时间将字符串的末尾归零



有关
strlen()
的剩余警告由
HASH\u ADD\u STR()
宏隐藏,但可能与
strcpy()
警告的问题相同-
s->id
字段不是字符指针或字符数组。修改后的结构可能也会推翻这些警告。为了让我们确信,您必须显示
HASH\u ADD\u STR()
的定义以及它调用的任何宏。

什么是
user\u id
?它是如何定义的?另外,
HASH\u ADD\u STR
是如何定义的?@Als抱歉,我不太清楚,我认为在本例中,user\u id只是传递给函数的变量的名称,在本例中是“IBM”还是“good”?我认为
HASH\u ADD\u STR
是一个包含在uthash中的宏。它最初是HASH_ADD_INT,但我将其更改为str,因为我的主键不是INT。
strcpy
接受目标和源字符串的地址,函数假设目标足够大,可以容纳字符串。在您的情况下,目标是一个
char
,而源可能是一个字符串,您无法将字符串复制到字符,字符(
1字节
)中没有足够的内存来保存字符串。您可以将一个字符分配给另一个不需要复制的字符。@Als您是对的。。我没有意识到。。我知道INT等的大小。我只是错误地认为字符的自然大小是w