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

时间:2014-07-10 16:39:13

标签: c

我有一个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 关键字是否仅维护相同项目中的变量值?如果在从客户项目中调用的静态库函数中使用静态关键字,那么它是否可以工作?

我应该使用malloc而是将指针传递给returnBytes()吗?这是唯一的方法吗?

我正在运行Windows 7,我使用VC12编译库和库的客户端。

2 个答案:

答案 0 :(得分:1)

编辑:抱歉没注意到静电。随着静态它的工作原理。 我刚刚在osx上测试了你的代码,它的工作原理如下。

test.h:

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

test.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;
}

输出

f0 f0 f0
f0 d0 f0

这意味着你可以读写。

答案 1 :(得分:0)

static仅适用于您的功能。此外,任何通常的变量(位于堆栈中)总是在函数结束时死亡,因此结果错误。

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

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