从图书馆提供指针

时间:2015-12-08 21:11:51

标签: c pointers static-libraries

我是个大问题。我写了一个静态库,我想在软件中使用它。我的问题是:如果你将一个函数指针从库中返回到主程序,那么指针就没有来自库中指针的值。如果你将Libay.a的指针返回给main.c

,是否存在问题

MAIN.C:

#include <stdio.h>

int main(int argc, const char * argv[]) {

char *ptr;
Prallow_its(ptr, 122);
printf("%s", ptr);
return 0;

}

来自Prallow.a的Prallow.c

[...]

char *Prallow_its(char *ptr, int i){
static char buffer[255];
sprintf(buffer, "%u", i);
ptr = buffer;
return ptr;
}

[...]

2 个答案:

答案 0 :(得分:1)

可以从库中返回指向静态缓冲区的指针。它与您程序的其余部分位于相同的地址空间中。当然,它不是线程安全的,但这是一个单独的问题。

真正的问题是你打电话的方式:

char *ptr;               // <-- ptr uninitialised
Prallow_its(ptr, 122);   // <-- return value ignored
printf("%c", ptr);       // <-- ptr still uninitialised

你应该这样做:

ptr = Prallow_its( ptr, 122 );

或者,您可以允许ptr修改Prallow_its。在这种情况下,必须这样定义:

char *Prallow_its( char **ptr, int i )
{
    static char buffer[255];
    sprintf(buffer, "%u", i);
    *ptr = buffer;
    return *ptr;
}

并且这样称呼:

Prallow_its( &ptr, 122 );

答案 1 :(得分:0)

C按值传递,因此库函数中的行ptr = buffer执行更改ptrmain的值。

此外,库函数对传入的指针没有任何作用,因此没有理由传递指针。 Main.c中的代码应为

int main(int argc, const char * argv[]) 
{
    char *ptr = Prallow_its(122);
    printf("%s", ptr);
    return 0;
}

并且Prallow.c中的代码应该是

char *Prallow_its(int i)
{
    static char buffer[255];
    sprintf(buffer, "%u", i);
    return buffer;
}