在成员函数中指向字符数组会不会有问题?

问题描述

int setString(char *pcString)
{
    if( NULL == pcString )
    {
        pcString = "";
    }
        
    if( NULL == m_pcData )
    {
        m_pcData = new char[m_nBufferLength];
        memset(m_pcData,'\0',m_nBufferLength);
    }


    int nCurrentBuffer      = 0;
    int nLength             = 0;
    int nInputStringLength  = 0;

    nLength             = strlen(m_pcData) + knNULL_CHARACTER_SPACE;
    nCurrentBuffer      = (m_nBufferLength > nLength) ? m_nBufferLength : nLength ;
    nInputStringLength  = strlen(pcString) + knNULL_CHARACTER_SPACE;

    if( nCurrentBuffer < nInputStringLength )
    {
        delete[] m_pcData;
        m_pcData = new char[nInputStringLength];
    }

    strcpy(m_pcData,pcString);

    return nInputStringLength;
}

line5 pcString = ""->可能会出现问题,取决于以后编写代码的方式?

有人指出,这可能是演讲中的问题。

他说

pcString = new char;
pcString[0] = '\0';

是更好的代码。

但是我不明白为什么? 有人可以给我一些解释吗?

pcString = "";
strcpy(pcString,"C++ Problem");

这是其中一种吗?

解决方法

pcString被声明为指向字符的指针,因此隐式假定可以更改这些字符。文字“”是一串常量字符,因此无法更改。出于向后兼容性的原因,C ++允许您进行分配:

pcString = "";

,但以下代码无法编译:

const char* str0 = "";
pcString = str0;

因此,您可以在const之前添加char* pcString,此功能就可以了:

int setString(const char *pcString)
{
  //....
}

如果pcString字符串应保持可更改,则赋值:

pcString = "";

以下代码可能有问题:

*pcString = '\0'; // undefined behavior (1)

delete[] pcString; // undefined behavior (2)

(1)-尝试修改常量字符串 (2)-尝试释放未分配的内存

注意。如果您进行更正:

pcString = new char;
pcString[0] = '\0';

然后您需要提供释放的已分配内存。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...