c - 指向字符串文字的指针 - 重写/重新分配
问题描述
以下面的方式使用 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;
}
解决方案
以下面的方式使用 char 指针(char *retStatus)可以吗?就像在需要时分配/重写值而不分配内存一样?
字符串文字表示具有静态存储持续时间的数组char
,具有(相当大的)限制,即任何修改数组内容的尝试都会产生未定义的行为。您可以使用任何其他char
数组的任何方式使用字符串文字,但要遵守您不尝试修改它们的限制。
话虽如此,最好避免将字符串文字分配给 type 的变量char *
,或者将它们作为对应于该类型参数的函数参数传递。相反,将自己限制在 type 的指针上const char *
,这些指针明确地传达了相关的限制。
我对其进行了测试,它工作正常,但想知道这是将错误消息分配给 char * 然后复制/连接到其他静态或分配的内存指针的好方法。
允许在不可变访问之后进行赋值的特定组合,并且可以可靠地工作,但同样,最好使用 type 的const char *
变量而不是 type 的变量char *
。但是请注意,如果您不小心,可能会以这种方式让自己陷入困境。例如,sizeof("error1")
不太可能等于(retStatus = "error1", sizeof(retStatus))
。
推荐阅读
- python - 图像和图表未更新
- android - 如何在 Flutter 集成测试期间伪造电池设置/状态?
- r - R中的元素子集
- powershell - Powershell - 从“组对象”输出重命名文件
- ansible - 使用 Ansible 脚本在 Windows 操作系统上的 exe 文件上设置“以管理员身份运行”
- r - R 错误,包 'colorspace',scale_fill_continuous_diverging() 在函数中不起作用,而 scale_color_continuous_diverging() 起作用
- python - 如何在上面的csv文件中和给定值之间保存值在python中自己的csv
- javascript - 使用响应式扩展立即显示子行,包括第一列
- tensorflow - 评估训练和加载的 CNN keras 模型问题
- python - 重新采样时间序列