我在c:
中有类似以下的源代码char *get_str() {
char *str;
int slen=get_strlen();
str=(char *)malloc(sizeof(char)*slen);
set_str(str);
printf("returning str %s with len %d\n", str, strlen(str));
return str;
}
int main() {
char *str=get_str();
printf("recieved str %s with len %d\n", str, strlen(str));
}
我得到以下输出:
returning str hi with len 2
received str with len 0
这让我疯了。 “返回str”语句具有应有的功能,但“收到的str”仍然会返回null。我已经证实了slen非零。设置字符串的函数是大型且广泛使用的软件包的一部分,因此可以假设正确设置字符串。
编辑:
如下所述,此处提供的信息不足以解决问题。我还需要指出函数get_str在不同的源代码文件中。问题最终是因为我忘了在标题中添加一行get_str(),而alk和Nitzan Shaked正确地猜到了这一行。这不会导致编译错误,因为我使用的是ansi c编译器,它只是假设get_str会返回一个整数。
答案 0 :(得分:6)
我敢打赌这可以在64位系统上运行,你的代码看起来像这样:
int main() {
char *str=get_str();
printf("received str %s with len %d\n", str, strlen(str));
}
char *get_str() {
char *str;
int slen=get_strlen();
str=(char *)malloc(sizeof(char)*slen);
set_str(str);
printf("returning str %s with len %d\n", str, strlen(str));
return str;
}
要解决此问题,请添加适当的原型:
char *get_str();
之前该功能首次使用。
On(大多数?)32位系统指针是32位宽,与编译器默认函数的int
大小相同,因为缺少prototpye,所以尽管使用了错误的类型,值会被传递成功备份。后者在64位系统上不再起作用,因为指针(在大多数系统上)比int
宽。