我有一个文件,它有一个静态常量字符串和一个返回指向该字符串的指针的函数。 文件看起来像这样:
typedef unsigned char BOOLEAN;
#define TRUE 1
#define FALSE 0
static const unsigned char MAL_Version[8] = "2.001";
/* Function to return Version string */
BOOLEAN GetVersion ( unsigned char* pu8Version )
{
BOOLEAN success = FALSE;
if(pu8Version != NULL)
{
pu8Version = &MAL_Version[0];
success = TRUE;
printf("\r\nTRUE");
printf("\r\n%s", pu8Version);
}
return success;
}
在main()中,我声明一个数组并将其传递给GetVersion函数。 当我这样做时,我会得到随机字符。
int main() {
unsigned char buffer[10];
GetVersion(buffer);
printf("\r\n%s", buffer);
}
输出是:
TRUE
2.001
D3
我缺少什么?函数中的指针正确打印字符串,但是当它返回时,它会打印垃圾。
答案 0 :(得分:5)
本声明
pu8Version = &MAL_Version[0];
仅修改pu8Version
中的本地指针GetVersion()
,并且buffer
中不会更改main()
。
而不是:
pu8Version = &MAL_Version[0];
您可以将MAL_Version
复制 buffer
:
strcpy(pu8Version, MAL_Version);
如果您真的不需要MAL_Version
的副本,您也可以直接将指针返回MAL_Version
。类似的东西:
/* Function to return Version string */
const char *GetVersion(void)
{
return MAL_Version;
}
int main(void) {
const char *version = GetVersion();
printf("\n%s", version);
}
请注意,您没有定义" BOOLEAN"你自己。自C99起,bool
(来自<stdbool.h>
标题)类型在C中可用。
答案 1 :(得分:0)
函数参数pu8Version
是传递指针的本地副本。
您将pu8Version
更改为指向正确打印的静态字符串MAL_Version
。在返回功能时,pu8Version
的更改版本被遗忘。
原始unsigned char buffer[10];
未初始化并且仍然如此,因此会打印出垃圾。
请注意,您无法使用=
运算符复制C字符串。这样做是为了改变指针,而不是它指向的指针。您应该使用strcpy
。
答案 2 :(得分:0)
或者您可以将指针传递给指针:
/* Function to return Version string */
BOOLEAN GetVersion ( unsigned char **pu8Version )
{
BOOLEAN success = FALSE;
if(*pu8Version != NULL)
{
*pu8Version = MAL_Version;
success = TRUE;
printf("\r\nTRUE");
printf("\r\n%s", *pu8Version);
}
return success;
}
int main() {
unsigned char *buffer;
GetVersion(&buffer);
printf("\r\n%s", buffer);
}