首页 > 解决方案 > 指向字符串文字的指针 - 重写/重新分配

问题描述

以下面的方式使用 char 指针(char *retStatus)可以吗?就像在需要时分配/重写值而不分配内存一样?我对其进行了测试,它工作正常,但想知道这是将错误消息分配给 char * 然后复制/连接到其他静态或分配的内存指针的好方法。

void fn(char *status, size_t maxLen)
{
    char *retStatus = NULL;
    ...
    ...

    if(failure)
    {
        retStatus = "error1";   
        if((strlen(retStatus) + strlen(status)) < maxLen)
        {
            strcat_s(status, maxLen, retStatus);
        }
    }

    ...
    ...

    if(failure)
    {
        retStatus = "error2";   
        if((strlen(retStatus) + strlen(status)) < maxLen)
        {
            strcat_s(status, maxLen, retStatus);
        }
    }
}

int main()
{
    char status[10] = { 0 };
    size_t statusMaxLen = sizeof(status) / sizeof(status[0]);
    fn(status, statusMaxLen);
    return 0;
}

标签: c

解决方案


以下面的方式使用 char 指针(char *retStatus)可以吗?就像在需要时分配/重写值而不分配内存一样?

字符串文字表示具有静态存储持续时间的数组char,具有(相当大的)限制,即任何修改数组内容的尝试都会产生未定义的行为。您可以使用任何其他char数组的任何方式使用字符串文字,但要遵守您不尝试修改它们的限制。

话虽如此,最好避免将字符串文字分配给 type 的变量char *,或者将它们作为对应于该类型参数的函数参数传递。相反,将自己限制在 type 的指针上const char *,这些指针明确地传达了相关的限制。

我对其进行了测试,它工作正常,但想知道这是将错误消息分配给 char * 然后复制/连接到其他静态或分配的内存指针的好方法。

允许在不可变访问之后进行赋值的特定组合,并且可以可靠地工作,但同样,最好使用 type 的const char *变量而不是 type 的变量char *。但是请注意,如果您不小心,可能会以这种方式让自己陷入困境。例如,sizeof("error1")不太可能等于(retStatus = "error1", sizeof(retStatus))


推荐阅读