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

时间:2017-09-05 16:05:11

标签: 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;
}

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

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

   GetVersion(buffer);
   printf("\r\n%s", buffer);
}

输出是:

TRUE

2.001

D3

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

3 个答案:

答案 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);
}

请注意,您没有定义&#34; BOOLEAN&#34;你自己。自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);
}