2015-12-08 25 views
0

我有一个很大的问题。我写了一个静态库,我想在一个软件中使用。我的问题是,如果将一个函数指针从库外返回到主程序,则该指针不具有库中指针的值。是否有一个问题,如果从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; 
} 

[...] 
+0

您正在使用C或C++?标记一个。 – aschepler

+1

另外,你的问题没有意义。 –

+0

对不起,我只使用C –

回答

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); 
+0

或者,由于函数没有使用参数'ptr'的传入值,所以您可以这么做:'ptr = Prallow_its(NULL,122);'(与OP的实现)。 –

+0

哦耶稣它的作品非常感谢你 –

0

C通过由值,所以在程序库函数的线ptr = buffer确实变化的值在main中的ptr

此外,库函数不会对传入的指针做任何事情,所以没有理由传递指针。 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; 
} 
+0

还有人可以争辩说,'Prallow_its'的返回类型应该是'const char *'...但这只是我的意见:) – gurka

+0

@gurka是的,你可能不想要给调用者打乱缓冲区。 OTOH,如果它是我的库,我根本不会使用静态缓冲区。该库应该或者'malloc'缓冲区,或者强制调用者通过一个缓冲区(以及缓冲区的大小)。 – user3386109

相关问题