Возвращаемые локальные указатели переменных – C

Я пытаюсь написать функцию в C, чтобы return обратную строку, которая передается функции.

После передачи строки я объявляю локальный char [] чтобы заполнить обратную строку.

Однако, когда я компилирую программу, я получаю предупреждение с warning: function returns address of local variable return test;

Мне разрешено возвращать локальные указатели переменных из функций в C?

 char *reverseString(char *str) { int i, j; char test[strlen(str)]; if(str == 0) return; for(i = 0, j = strlen(str); i = 0; i++, j--) str[j] = test[i]; return test; } 

  1. Вам нужно больше места для строки, strlen() дает вам количество символов, но c строк используют дополнительный символ для обозначения конца строки, символ '\0' ascii nul , поэтому 1 + strlen(otherString) является всегда требуется копировать строку.

  2. Вы проверяете str для NULL после разыменования. Это не имеет смысла, проверьте кулак для NULL а затем вызовите strlen() .

  3. Использование strlen() таким образом не является хорошей идеей, поскольку в c длина строки нигде не сохраняется, вызов strlen() в основном вычисляет строку таким образом

     size_t strlen(const char *string) { size_t count = 0; while (*string++ != '\0') count++; return count; } 

    там вы можете увидеть, насколько важно завершение '\0' , и почему вы не должны вызывать strlen() в цикле для строки, длина которой не изменяется.

  4. Если вы вернете адрес локальной переменной, он не будет работать так, как вы ожидаете, потому что он будет освобожден, когда функция вернется, поэтому вам нужно использовать динамическое распределение, поскольку существует malloc() что упрощает его выполнение, так что в вашем случае это будет что-то вроде этого

     char *reverseString(char *str) { size_t index; char *test; size_t length; if (str == NULL) return NULL; length = strlen(str); test = malloc(1 + length); if (test == NULL) return NULL; /* perform string reversal */ for (index = 0 ; index < length ; index++) test[index] = str[length - index - 1]; /* add the `nul` terminator */ test[length] = '\0'; /* return the newly allocated and initialized data */ return test; }