This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:使用返回指针将指针返回到函数调用中的局部变量

Guru**** 2538950 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1038013/msp430fr2355-returning-pointer-to-local-variable-in-function-call-with-return-pointer

器件型号:MSP430FR2355

您好!

我尝试使用返回指针创建函数调用。

CCS X 会对其进行编译、但会出现警告。 代码工作正常、返回正确的值。

如果有任何建议可以取消警告、我们将不胜感激。

char *ptoa (int value, char base);

int
main (){
  printf ("%s", ptoa (0x1234, 16));

  return 0;
}

char *ptoa (int value, char base){
  const char zString[] = "FEDCBA9876543210123456789ABCDEF";
  static char result[16];
  char *ptr = result, *ptr1 = result, tmp_char;
  int tmp_value;
  int init_value = value;
do{
      tmp_value = value;
      value /= base;
      *ptr++ = zString[15 + (tmp_value - value * base)];
    }
  while (value);
  if (tmp_value < 0)
    *ptr++ = '-';
  *ptr-- = '\0';
  while (ptr1 < ptr){
      tmp_char = *ptr;
      *ptr-- = *ptr1;
      *ptr1++ = tmp_char;
    }
  return result;
}

UPD:我尝试了 char *结果而不是 char 结果[],该函数不会返回正确的值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是一个错误、因为当函数返回栈上为诸如 result[16]之类的自动变量分配的空间时、会释放。 您的数据可能会在那里保留一会儿、但可能会在下一个函数调用中被改写。 将新的东西压入堆栈时。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复、David。

    正如我提到的,我尝试使用 char *结果而不是 char 结果[],但在这种情况下,函数不返回任何结果。 您是否在代码中看到任何其他流程?

    最初、我将该位置与 void itoa (int value、char * result、char base)值一起传递给函数;但代码使用 return 看起来更优雅。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、***、

    您能否发布准确的警告消息?

    谢谢、

    王国新

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    #1132-D 返回局部变量的指针

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正如 David 指出的、这是无效的 C 语言、因为函数返回后指针(目标)立即变为无效("悬空")。 这种危险已众所周知40多年。 在一种完全意外的情况下工作。

    将其声明为"static char result[16];"、并且至少是有效的 C、尽管仍然存在几个(较小)危险。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Bruce。 这解决了问题。 静态是关键字。

    代码的第12行应为:static char result[16];