Intereting Posts
OpenMP – Почему уменьшается количество сравнений? Как правильно реализовать функции c malloc / realloc? Вызов базовой функции из производного Как эффективно отлаживать многопоточное проклятие клиент-серверного приложения с помощью gdb? C – неопределенное значение неопределимое? Проверка fftw3 с valgrind c выражение Оценщик Является ли epoll поточно-безопасным? Для макроса цикла, который развернут на этапе предварительного процессора? Имеет ли код с несколькими трубами в C смысл? Как функция sizeof работает для разных типов данных при добавлении и вычислении? Выполняя вызов функции в C, является ли стек используемой ОС и является ли размер стека фиксированным? Какое самое большое преимущество использования указателей в ObjectiveC Максимальное количество streamов для каждого процесса – sysconf (_SC_THREAD_THREADS_MAX) сбой Почему мне нужно дважды набирать Ctrl-D, чтобы отметить конец файла?

Возвращаемые локальные указатели переменных – 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; }