Понимание указателей, используемых для out-параметров в C / C ++

0

Как вернуть массив символов из функции?

имеет следующий код в ответах:

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 и имею базовое понимание указателей)

Благодарю.

  • 0
    Используйте strcpy (). Не добавление аргумента, который передает размер переданного символа char [], является ошибкой.
  • 0
    Можете ли вы уточнить размер символа []. Если я не использую его размер, то зачем его пропускать?
Показать ещё 2 комментария
Теги:
pointers
arduino
function

2 ответа

1
Лучший ответ

Почему это не работает?

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

У тебя есть:

testfunc(myStr);

Когда testfunc, outStr присваивается адрес первого элемента myStr. Но в функции testfunc вы переписываете outStr и теперь он указывает на строковый литерал. Вы ouStr только ouStr, а не myStr.

Как это исправить?

Чтобы скопировать строку, используйте функцию strcpy (или ее безопасную сестринскую strncpy):

void testfunc(char* outStr){
     strcpy(ouStr, "Hi there."); 
 }
  • 0
    Этот ответ не использует память повторно!
  • 0
    @LS_dev Я не хотел менять его первоначальную предпосылку: у него есть массив и он хочет скопировать в него строку (для возможного изменения потом).
0

Если вы хотите повторное использование памяти - и это опасное место, нужно ли вам действительно заботиться об ответственности за распределение/освобождение, вы должны использовать указатель на строку, то есть:

#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.
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню