C 直接向宏发送字符串与从数组发送字符串的结果不同

C 直接向宏发送字符串与从数组发送字符串的结果不同,c,C,关于字符串,我认为有一些基本的东西我还不了解(对C来说是新的)。基本上我使用的是,当我直接发送字符串而不是从循环(即从数组获取数据)中发送字符串时,它可以工作 下面是一个例子: enum { MAX_ID_LEN = 5 }; struct my_struct { char id[MAX_ID_LEN]; /* key */ float price; UT_hash_handle hh; /* makes this s

关于字符串,我认为有一些基本的东西我还不了解(对C来说是新的)。基本上我使用的是,当我直接发送字符串而不是从循环(即从数组获取数据)中发送字符串时,它可以工作

下面是一个例子:

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

void new_stock(char *user_id, float price) {
    //printf("%c - %f \n", *user_id, 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.. \n");
    new_stock("IBM", 10.2);
    new_stock("goog", 2.2);
    return 0;
}
这是可行的,但当我尝试从数组中执行相同的操作时,它就不起作用了(编译时我没有收到错误)

char*name_all[]={“ibm”,“goog”};
int name_all_size=sizeof(name_all)/sizeof(char);
浮动价格_all[]={10.2,2.2};
枚举{MAX_ID_LEN=5};
结构我的结构{
字符id[MAX_id_LEN];/*键*/
浮动价格;
UT_hash_handle hh;/*使此结构可哈希*/
};
struct my_struct*users=NULL;
void insert_data(){
printf(“插入数据”);
国际数据中心;
对于(data_loc=0;data_locid,name_all[data_loc]);
s->price=price_all[data_loc];
//printf(“%s-%f\n”,s->id,s->price);//ahh显示正确,但仍然失败
HASH_ADD_STR(users,id,s);/*id:键字段的名称*/
}
}
int main(){
插入_数据();
返回0;
}
我是C语言的新手,所以我可能估计这是错误的,但我认为这与我传递变量的方式有关。当我第一次尝试时,我将它发送到
new_stock
函数,但它只显示第一个字符,因此为了避免传递变量的问题,我只是将函数的所有内容移动到我用来添加所有数据的函数中,但我仍然遇到同样的问题

知道我做错了什么吗

另外,出于个人兴趣,是否有任何工具可以警告我代码中的问题?我发现gcc很有用,但一旦警告停止,我就不知道如何进行故障排除。是否有什么东西可以帮助我更早地发现这样的问题(比gcc更详细的东西)。不确定是否可能,但想问一下。

以下是您的错误:

char *name_all[] =  {"ibm", "goog"};
int name_all_size =sizeof(name_all)/sizeof(char);
数组
name\u all
是一个由
char
指针组成的数组,而不是
char
,因此,如果您在32位系统上使用32位指针,那么该数组只有8个字节,而在64位系统上使用64位指针,则该数组只有16个字节。请记住,指向的字符串文字不存储在数组中,只有指向字符串文字的指针在数组中。你真正想要的是:

int name_all_size = sizeof(name_all)/sizeof(char*);
                                            ^^^^^ note the pointer type
这将为您提供一个值
2
,这是
name\u all
中正确的元素数

char *name_all[] =  {"ibm", "goog"};
int name_all_size =sizeof(name_all)/sizeof(char);
char *name_all[] =  {"ibm", "goog"};
int name_all_size =sizeof(name_all)/sizeof(char);
数组
name\u all
是一个由
char
指针组成的数组,而不是
char
,因此,如果您在32位系统上使用32位指针,那么该数组只有8个字节,而在64位系统上使用64位指针,则该数组只有16个字节。请记住,指向的字符串文字不存储在数组中,只有指向字符串文字的指针在数组中。你真正想要的是:

int name_all_size = sizeof(name_all)/sizeof(char*);
                                            ^^^^^ note the pointer type
这将为您提供一个值
2
,这是
name\u all
中正确的元素数

char *name_all[] =  {"ibm", "goog"};
int name_all_size =sizeof(name_all)/sizeof(char);
name\u all
是由两个
char*
组成的数组。因此,
sizeof name\u all
2*sizeof(char*)
,通常是8或16,这取决于您使用的是32位还是64位系统
sizeof(char)
定义为1。所以在

for (data_loc=0;data_loc<name_all_size;data_loc++) {
    //printf("%s - %f \n", name_all[data_loc], price_all[data_loc]);
    //new_stock(name_all[data_loc], price_all[data_loc]);
    //new try
    struct my_struct *s;
    s = (struct my_struct*)malloc(sizeof(struct my_struct));
    strcpy(s->id, name_all[data_loc]);
    s->price = price_all[data_loc];
    //printf("%s - %f \n", s->id, s->price); //ahh displays correctly but still fails
    HASH_ADD_STR( users, id, s );  /* id: name of key field */

}
for(data_loc=0;data_locid,name_all[data_loc]);
s->price=price_all[data_loc];
//printf(“%s-%f\n”,s->id,s->price)//ahh显示正确,但仍然失败
HASH_ADD_STR(用户、id、s);/*id:密钥字段的名称*/
}
您正在访问数组的末尾
name\u all

char *name_all[] =  {"ibm", "goog"};
int name_all_size =sizeof(name_all)/sizeof(char);
您的意思是在
name\u all\u size
中除以
sizeof(char*)

name\u all
是由两个
char*
组成的数组。因此,
sizeof name\u all
2*sizeof(char*)
,通常是8或16,这取决于您使用的是32位还是64位系统
sizeof(char)
定义为1。所以在

for (data_loc=0;data_loc<name_all_size;data_loc++) {
    //printf("%s - %f \n", name_all[data_loc], price_all[data_loc]);
    //new_stock(name_all[data_loc], price_all[data_loc]);
    //new try
    struct my_struct *s;
    s = (struct my_struct*)malloc(sizeof(struct my_struct));
    strcpy(s->id, name_all[data_loc]);
    s->price = price_all[data_loc];
    //printf("%s - %f \n", s->id, s->price); //ahh displays correctly but still fails
    HASH_ADD_STR( users, id, s );  /* id: name of key field */

}
for(data_loc=0;data_locid,name_all[data_loc]);
s->price=price_all[data_loc];
//printf(“%s-%f\n”,s->id,s->price)//ahh显示正确,但仍然失败
HASH_ADD_STR(用户、id、s);/*id:密钥字段的名称*/
}
您正在访问数组的末尾
name\u all

char *name_all[] =  {"ibm", "goog"};
int name_all_size =sizeof(name_all)/sizeof(char);

你是不是想在
name\u all\u size
中除以
sizeof(char*)

wow.现在可以了..但我更困惑了。按照我的方式,它仍然正确地打印数据(使用printf)。比如,它列出了所有的数据,只是没有将它们添加到hash映射中。好的,你要经过一个指针数组的末尾,因此,通过
strcpy
注入这些内存位置的数据几乎可以发生任何事情。。。例如,您可能一直在写哈希映射本身,或者与哈希映射控制相关的其他内存。请记住,
strcpy
只有在找到空终止值时才会停止,因此,一旦开始读取数组末尾以外不指向空终止字符串的指针,一切都会发生…好的,我想我现在明白了,它实际上是一种工作的预期,但它只是继续下去,因为我没有计算正确的大小和失败后。它会编译的很好,因为你所做的是完全合法的C。。。我说的是运行时错误。也没有运行时错误。我用的是命令行和ecslipe,没有任何错误哇…现在可以了…但我更困惑了。按照我的方式,它仍然正确地打印数据(使用printf)。比如,它列出了所有的数据,只是没有将它们添加到hash映射中。好的,你要经过一个指针数组的末尾,因此,通过
strcpy
注入这些内存位置的数据几乎可以发生任何事情。。。比如说你妈,