图书馆指点

Give Pointer from Library

我有一个大问题。我写了一个静态库,我想在软件中使用它。我的问题是:如果您将库中函数的指针返回给主程序,则该指针没有库中指针的值。如果您将指针从 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.c 来自 Prallow.a

[...]

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

[...]

return 从库中指向静态缓冲区的指针没问题。它与程序的其余部分位于同一地址 space。当然,它不是线程安全的,但这是一个单独的问题。

真正的问题是你如何称呼它:

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

您应该这样做:

ptr = Prallow_its( ptr, 122 );

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

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

然后这样调用:

Prallow_its( &ptr, 122 );

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

此外,库函数不会对传入的指针执行任何操作,因此没有理由传递指针。 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;
}