1

我在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

这让我发疯了。“returning str”语句完全符合它的要求,但“received str”一直返回 null。我已经验证 slen 是非零的。设置字符串的函数是一个大型且广泛使用的软件包的一部分,因此可以假定正确设置了字符串。

编辑:

如下所述,此处提供的信息不足以解决问题。我还需要指出函数 get_str 位于不同的源代码文件中。问题最终是我忘记在标题中添加一行 get_str() ,下面是 alk 和 Nitzan Shaked 正确猜到的。这不会导致编译错误,因为我使用的是 ansi c 编译器,它只是假设 get_str 将返回一个整数。

4

1 回答 1

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();

函数第一次使用之前。


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

于 2013-08-07T18:06:27.367 回答