【问题标题】:Strange behavior with char pointer and char pointer returned by fonction in C/C++ with "cout"C/C++ 中带有“cout”的函数返回的 char 指针和 char 指针的奇怪行为
【发布时间】:2021-07-28 14:51:47
【问题描述】:

我有一个奇怪的行为,一个由返回函数的值和 cout 初始化的 char 指针。

我所有的代码都是针对 Arduino 应用程序的,这就是我使用 char 指针、char 数组和 string.h 的原因。 我创建了一个名为 FrameManager 的类,使用函数 getDataFromFrame 从字符串(实际上是 char 数组)中提取数据。见上文:

`char * FrameManager::getDataFromFrame ( const char frame[], char key[] )
{
  char *pValue = nullptr;
  int frameLength = strlen ( frame );
  int previousStartIndex = 0;
  for ( int i=0; i<frameLength; i++ ) {
    char c = frame[i];
    if ( c == ',' ) {
        int buffSize = i-previousStartIndex+1;
        char subbuff[buffSize];
        memset ( subbuff, 0, buffSize ); //clear buffer
        memcpy ( subbuff, &frame[previousStartIndex], i-previousStartIndex );
        subbuff[buffSize]='\0';
        previousStartIndex = i+1;

        int buffLength = strlen ( subbuff );
        const char *ptr = strchr ( subbuff, ':' );
        if ( ptr ) {
            int index = ptr-subbuff;
            char buffKey[index+1];
            memset ( buffKey, 0, index+1 );
            memcpy ( buffKey, &subbuff[0], index );
            buffKey[index+1]='\0';
            char buffValue[buffLength-index];
            memset ( buffValue, 0, buffLength-index );
            memcpy ( buffValue, &subbuff[index+1], buffLength-index );
            buffValue[buffLength-index]='\0';

            if ( strcmp ( key,buffKey ) == 0 ) {
                pValue = &buffValue[0];
                break;
            }
        }
    } else if ( i+1 == frameLength ) {
        int buffSize = i-previousStartIndex+1;
        char subbuff[buffSize];
        memcpy ( subbuff, &frame[previousStartIndex], frameLength-1 );
        subbuff[buffSize]='\0';
        int buffLength = strlen ( subbuff );
        const char *ptr = strchr ( subbuff, ':' );
        if ( ptr ) {
            int index = ptr-subbuff;
            char buffKey[index+1];
            memset ( buffKey, 0, index+1 );
            memcpy ( buffKey, &subbuff[0], index );
            buffKey[index+1]='\0';
            char buffValue[buffLength-index];
            memset ( buffValue, 0, buffLength-index );
            memcpy ( buffValue, &subbuff[index+1], buffLength-index );
            buffValue[buffLength-index]='\0';

            if ( strcmp ( key,buffKey ) == 0 ) {
                pValue = &buffValue[0];
                break;
            }
        }
    }
}

return pValue;

}`

在 main() 中,我创建了一些代码来测试返回值:

int main(int argc, char **argv) {

  const char frame[] = "DEVICE:ARM,FUNC:MOVE_F,PARAM:12,SERVO_S:1";
  FrameManager frameManager;
  char key[] = "DEVICE";
  char *value; 
  value = frameManager.getDataFromFrame(frame, &key[0]);
  cout << "Retrieved value: " << value << endl;
  cout << "Retrieved value: " << frameManager.getDataFromFrame(frame, &key[0]) << endl;

  printf("%s",value);

  return 0;
}

结果如下:

  • 检索值:y%R
  • 检索值:ARM
  • ARM

第一个“cout”不显示预期值。 第二个“cout”也显示期望值和 printf。

我不明白第一个“cout”有什么问题。

谢谢

乔斯林

【问题讨论】:

  • 忽略 C++ 的东西,在 C 中我会将结果缓冲区传递给函数:char *getDataFromFrame(char *dst, const char *frame, const char *key);

标签: c++ pointers char cout


【解决方案1】:

pValue 指向超出范围的本地数组。那是未定义的行为。它可能有效,但您的程序也可能崩溃、返回错误值(这就是您所经历的)、损坏您的数据或执行任何其他任意操作。

鉴于您已经在使用 C++,因此请考虑使用 std::string 作为结果,或者指向原始的 frame(如果可能)。

【讨论】:

  • 您好,感谢您的快速回复。我做了修改,现在我将结果缓冲区传递给函数,它正在工作:)
猜你喜欢
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多