为什么返回NULL

时间:2013-08-07 18:02:25

标签: c pointers null char return

我在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会返回一个整数。

1 个答案:

答案 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宽。