为什么返回NULL

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将返回一个整数.

alk*_*alk 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;
}
Run Code Online (Sandbox Code Playgroud)

要解决此问题,请添加适当的原型:

char *get_str();
Run Code Online (Sandbox Code Playgroud)

函数首次使用之前.


On(大多数?)32位系统指针是32位宽,这int与编译器默认函数的大小相同,因为缺少prototpye,因此尽管使用了错误的类型,该值会成功传回.后者在64位系统上不再起作用,因为指针(在大多数系统上)比a更宽int.