【问题标题】:Understanding pointers used for out-parameters in C/C++了解 C/C++ 中用于输出参数的指针
【发布时间】:2013-11-06 22:03:46
【问题描述】:

How do I return a char array from a function?

答案中有以下代码:

void testfunc(char* outStr){
  char str[10];
  for(int i=0; i < 10; ++i){
    outStr[i] = str[i];
  }
}

int main(){
  char myStr[10];
  testfunc(myStr);
  // myStr is now filled
}

由于我将使用内存非常宝贵的 Arduino,因此我不想要一个“临时变量”来存储一些字符串然后将其复制过来。我也不希望函数返回任何东西。我想使用上面的想法并执行以下操作:

 void testfunc(char* outStr){
     outStr="Hi there.";
  }

int main(){
  char myStr[10];
  testfunc(myStr);

}

但是,在这种情况下,myStr 是空的!

为什么这不起作用?我该如何解决?

(我对C比较陌生,对指针有基本的了解)

谢谢。

【问题讨论】:

  • 使用 strcpy()。不添加传递传递的 char[] 大小的参数是错误的。
  • 您能否详细说明传递 char[] 的大小。如果我不使用它的大小,那为什么要通过它?
  • 您说您没有使用大小,但是要复制字符串"Hi there.",您需要以某种方式知道参数指向的数组至少为10个字节。如果该数字 10 是您的函数文档的一部分,那么您几乎可以摆脱它。但这是一种不寻常的情况:更常见的是调用者需要告诉你数组的大小,这样你就可以避免超出它。
  • 谢谢!在您发布回复之前,我还发现了这个stackoverflow.com/questions/6638729/…

标签: c++ c function pointers arduino


【解决方案1】:

为什么这不起作用?

void testfunc(char* outStr){
     outStr="Hi there.";
 }

你有:

testfunc(myStr);

testfunc被调用时,outStr被分配myStr的第一个元素的地址。但是在testfunc 函数中,您覆盖了outStr,它现在指向一个字符串文字。你只是在修改ouStr,而不是myStr.

我该如何解决?

要复制字符串,请使用strcpy 函数(或其安全姐妹strncpy):

void testfunc(char* outStr){
     strcpy(ouStr, "Hi there."); 
 }

【讨论】:

  • 这个答案不会重用内存!
  • @LS_dev 我不想改变他最初的前提:他有一个数组并想在其中复制一个字符串(以便以后修改它)。
【解决方案2】:

如果你想重用内存 - 这是一个危险的地方,你必须非常小心分配/释放责任,你应该使用指向字符串的指针,即:

#define STATIC_STRING "Hi there"

void testfunc(char**outStr){
    *outStr=STATIC_STRING;
}

int main(){
   char*myStr;
   testfunc(&myStr);
   //From now on, myStr is a string using preallocated memory.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-14
    • 2023-02-02
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多