我有一个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编译库和库的客户端。
答案 0 :(得分:1)
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;