通过函数返回指向静态常量字符串的指针

Swa*_*and 0 c pointers

我有一个文件,它有一个静态常量字符串和一个函数,它将返回指向该字符串的指针.文件看起来像这样:

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;
}
Run Code Online (Sandbox Code Playgroud)

在main()中,我声明一个数组并将其地址传递给GetVersion函数.当我这样做时,我会得到随机字符.

int main() {
   unsigned char buffer[10];

   GetVersion(buffer);
   printf("\r\n%s", buffer);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

真正

2.001

D3

我错过了什么?函数中的指针正确打印字符串,但是当它返回时,它会打印垃圾.

usr*_*usr 5

这个说法

pu8Version = &MAL_Version[0];
Run Code Online (Sandbox Code Playgroud)

仅修改本地指针pu8VersionGetVersion(),并且不会改变buffermain().

代替:

pu8Version = &MAL_Version[0];
Run Code Online (Sandbox Code Playgroud)

您可以复制MAL_Version,以buffer具有:

strcpy(pu8Version, MAL_Version);
Run Code Online (Sandbox Code Playgroud)

如果你真的不需要副本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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,您自己没有定义"BOOLEAN".bool(来自<stdbool.h>标题)类型在C99中可用于C.