从静态库(.lib)中的c函数返回字符串(char*)

从静态库(.lib)中的c函数返回字符串(char*),c,C,我有一个C静态库,其中有一个名为returnBytes()的函数,该函数的定义如下: extern "C" unsigned char * returnBytes(void) { static unsigned char result[50] = { 0xF0, 0xF0, 0xF0 }; return result; } 在使用上述静态库(.lib)的另一个项目中,我调用如下函数: unsigned char *output = returnBytes(); 但

我有一个C静态库,其中有一个名为returnBytes()的函数,该函数的定义如下:

extern "C" unsigned char * returnBytes(void)
{
      static unsigned char result[50] = { 0xF0, 0xF0, 0xF0 };
      return result;
}
在使用上述静态库(.lib)的另一个项目中,我调用如下函数:

  unsigned char *output = returnBytes();
但是当我打印输出的内容时,它是不正确的。这意味着像这样调用自定义打印函数不会返回正确的值:

print_bytes(output, 50);
另一方面,从库中调用returnBytes()也可以。表示打印值0xF0、0xF0、0xF0

static关键字是否仅维护同一项目中的变量值?如果在从c客户机项目调用的静态库函数中使用static关键字,是否可能不起作用

我应该改用malloc并传递一个指向returnBytes()的指针吗?这是唯一的办法吗


我运行的是Windows7,我使用VC12作为库的编译器和库的客户端

静态
仅在函数内部工作。此外,任何通常的变量(位于堆栈中)都将始终在函数末尾消亡,因此产生错误的结果

要解决此问题,请在函数中使用动态分配

  unsigned char *result = calloc(50, 1);
  result[0] = 0x50;
  result[1] = 0x50;
  result[2] = 0x50;
  return result;

编辑:对不起,没有注意到静电。有了静电,它就工作了。 我刚刚在osx上测试了你的代码,它正常工作如下

测试h:

#ifndef TEST_H
#define TEST_H
#ifdef  __cplusplus
extern "C" {
#endif
   unsigned char * returnBytes(void); 
#ifdef  __cplusplus
}
#endif
#endif  /* TEST_H */
测试c:

unsigned char * returnBytes(void)
{
      static unsigned char result[50] = { 0xF0, 0xF0, 0xF0 };
      return result;
}
作为库libtest.a构建,并在其他项目中由main.c调用

#include <cstdlib>
#include <cstdio>
using namespace std;

#include "./test.h"

int main(int argc, char** argv) {

    unsigned char *c = returnBytes();
    printf("%x %x %x\n", c[0], c[1], c[2]);

    c[1]= 0xd0;

    c = returnBytes();
    printf("%x %x %x\n", c[0], c[1], c[2]);

    return 0;
}

这意味着你既能读也能写。

@austinbrunkhost,这是不正确的。他有一个
静态的
变量。哎呀,我忽略了。“不工作”是非常模糊的。您想告诉我们实际结果是什么,以及它与预期结果有何不同?你是怎么证明的?(您是否使用了
printf
?或者更复杂的方法?@abelenky I printf调用函数上的字节。当调用者是库中的另一个函数时,输出被正确打印,但当调用者是一个单独的程序时,则输出不正确,这意味着随机值被打印。鉴于这些不完整的信息,我看不出它为什么不工作。因此,请给出一个完整的代码示例和您得到的输出。“随机”是什么意思?每次运行时不同?变量声明为
static
。当函数返回时,它不会死。我从来没有这样说过。这是给其他人的。对于静态,我说它只在函数内部工作(保持活动)。但也许我的公式是错误的。函数可以返回
静态变量的地址。该地址将在调用函数中有效。你所说的“在你的功能中保持活力”是什么意思?@valentinmerier-See。我希望
result
能在课程期间提供。我不知道。如果调用函数可以访问
static
变量,那么我想我的答案可能无法解决问题。
f0 f0 f0
f0 d0 f0