【问题标题】:makes pointer from integer without a cast with strcpy使用 strcpy 从整数生成指针而不进行强制转换
【发布时间】:2012-06-09 02:22:49
【问题描述】:

我不知道我做错了什么。如果这显然是错误的,我正在学习 C 很抱歉,但我正在尝试使用 uthash 制作股票及其价格的哈希图。但是当我将股票添加到我的哈希图中时,我得到了上述错误。

我所做的是从他们的网站上获取示例并运行它以确保它正常工作,一旦它按预期工作,我更改了值以适应我的问题。在原始代码中,struct中的变量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 个项目,但是当我添加大小时,我仍然得到错误。

这是我认为相关的部分的 sn-p:

#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;
}

【问题讨论】:

  • 什么是user_id?它是如何定义的?还有HASH_ADD_STR是怎么定义的?
  • @Als 抱歉,我不确定我是否理解,我认为在这种情况下 user_id 只是我传递给函数的变量的名称,在这种情况下是“IBM”还是“好”?我认为HASH_ADD_STR 是 uthash 中包含的宏。它最初是 HASH_ADD_INT 但我将其更改为 str 因为我的主键不是 int。
  • strcpy获取目标地址和源字符串,该函数假定目标足够大以容纳字符串。在您的情况下,目标是char,而源可能是字符串,您无法将字符串复制到 char,char(1 byte) 中没有足够的内存来保存字符串。您可以将一个 char 分配给另一个不需要复制的字符。
  • @Als 你的权利..我没有意识到..我知道 INT 等的大小。我只是错误地认为 chars 也有自然的大小并没有意识到那 python/java 正在为我调整它。感谢您的帮助。

标签: c


【解决方案1】:

用这一行:

strcpy(s->id, user_id);

您正在尝试将字符串复制到字符上。请注意,strcpy 的两个参数都是 pointers 指向字符:char *

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

如果您想使用 C,那么您应该获得一份 K&R 的副本,但如果做不到这一点,您可能会花一些时间查看 this

【讨论】:

  • hmm..我应该使用 strcpy 吗?当我尝试s-&gt;id = user_id; 时,我仍然遇到同样的错误。
  • 您应该更喜欢strncpy,这是您可能一直在查看的版本,它接受 3 个参数,但您需要先了解 C 如何处理字符串。
【解决方案2】:

您需要在结构中为用户 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-&gt;id) 更长,您可能会发现代码在将字符串尾部归零时浪费时间。


关于strlen() 的剩余警告被HASH_ADD_STR() 宏隐藏,但很可能来自与strcpy() 警告相同的问题——s-&gt;id 字段不是字符指针或字符数组。修改后的结构也可能会取消这些警告。为了让我们确定,您必须显示 HASH_ADD_STR() 的定义以及它调用的任何宏。

【讨论】:

  • 啊..我改变了大小,它起作用了。抱歉,到目前为止,我一直在使用整数,从不使用字符,我只是假设(错误地)C 刚刚接受了我发送的任何大小。我做到了,一切正常!我会考虑像你提到的那样裁剪字符串。
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 2021-01-19
  • 2023-02-08
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
相关资源
最近更新 更多