Я только начинаю назначение для uni, и это вызывает у меня вопрос.
Я не понимаю, как вернуть строку из функции без утечки памяти.
char* trim(char* line) {
int start = 0;
int end = strlen(line) - 1;
/* find the start position of the string */
while(isspace(line[start]) != 0) {
start++;
}
//printf("start is %d\n", start);
/* find the position end of the string */
while(isspace(line[end]) != 0) {
end--;
}
//printf("end is %d\n", end);
/* calculate string length and add 1 for the sentinel */
int len = end - start + 2;
/* initialise char array to len and read in characters */
int i;
char* trimmed = calloc(sizeof(char), len);
for(i = 0; i < (len - 1); i++) {
trimmed[i] = line[start + i];
}
trimmed[len - 1] = '\0';
return trimmed;
}
Как видите, я возвращаю указатель на символ, который является массивом.Я обнаружил, что если я попытаюсь создать «урезанный» массив чем-то вроде:
char trimmed[len];
, то компилятор выдаст сообщение о том, что в этой строке ожидается константа.Я предполагаю, что это означало, что по какой-то причине вы не можете использовать переменные в качестве длины массива при инициализации массива, хотя что-то говорит мне, что это не может быть правильным.
Поэтому вместо этого я создал свой массив, выделив некоторую памятьна указатель на символ.
Я понимаю, что эта функция, вероятно, является неоптимальной для того, что она пытается сделать, но я действительно хочу знать:
Можете ли вы обычно инициализировать массив, используя переменную для объявления длины, например:
char trimmed [len];
Если бы у меня был массив этого типа(char trimmed []) будет иметь тот же тип возврата, что и указатель на char (то есть char *).
Если я сделаю свой массив, выделив некоторую память и выделив егоуказатель на символ, как мне освободить эту память.Мне кажется, что как только я вернул этот массив, я не могу получить к нему доступ, чтобы освободить его, поскольку он является локальной переменной.