Я только начинаю задание для 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, который является массивом. Я обнаружил, что если бы я попытался сделать массив "обрезанный" чем-то вроде:
char trimmed[len];
тогда компилятор будет вызывать сообщение о том, что в этой строке ожидалась константа. Я предполагаю, что это означает, что по какой-то причине вы не можете использовать переменные в качестве длины массива при инициализации массива, хотя что-то говорит мне, что это невозможно.
Поэтому вместо этого я создал свой массив, выделив некоторую память указателю char.
Я понимаю, что эта функция, вероятно, неоптимальна для того, что она пытается сделать, но я действительно хочу знать:
-
Можно ли инициализировать массив с помощью переменной, чтобы объявить длину, например:
char обрезано [len];
-
Если бы у меня был массив такого типа (char trimmed []), он имел бы тот же тип возврата, что и указатель на char (т.е. char *).
-
Если я создаю свой массив, выделив некоторую память и выделив ее указателю char, как мне освободить эту память. Мне кажется, что как только я верну этот массив, я не могу получить доступ к нему, чтобы освободить его, поскольку это локальная переменная.