Wil*_*ett 1 c null pointers return char
我在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));
}
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
returning str hi with len 2
received str with len 0
Run Code Online (Sandbox Code Playgroud)
这让我疯了."返回str"语句具有它应该具有的功能,但"接收到的str"仍然会返回null.我已经证实了slen非零.设置字符串的函数是大型且广泛使用的软件包的一部分,因此可以假设正确设置字符串.
编辑:
如下所述,此处提供的信息不足以解决问题.我还需要指出函数get_str在不同的源代码文件中.问题最终是因为我忘了在标题中添加一行get_str(),而alk和Nitzan Shaked正确地猜到了这一行.这不会导致编译错误,因为我使用的是ansi c编译器,它只是假设get_str将返回一个整数.
我敢打赌,它运行在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;
}
Run Code Online (Sandbox Code Playgroud)
要解决此问题,请添加适当的原型:
char *get_str();
Run Code Online (Sandbox Code Playgroud)
在函数首次使用之前.
On(大多数?)32位系统指针是32位宽,这int与编译器默认函数的大小相同,因为缺少prototpye,因此尽管使用了错误的类型,该值会成功传回.后者在64位系统上不再起作用,因为指针(在大多数系统上)比a更宽int.
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |