Je viens juste de commencer une mission pour l'uni et il a soulevé une question pour moi.
Je ne comprends pas comment faire pour retourner une chaîne de caractères à partir d'une fonction sans avoir une fuite de mémoire.
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;
}
comme vous pouvez le voir je suis de retour d'un pointeur de char qui est un tableau. J'ai trouvé que si j'ai essayé de faire de la " garni de tableau par quelque chose comme:
char trimmed[len];
ensuite, le compilateur pourrait lancer un message disant qu'une constante a été prévu sur cette ligne. Je suppose que cela signifie que, pour une raison quelconque vous ne pouvez pas utiliser des variables comme la longueur du tableau lors de l'initialisation d'un tableau, bien que quelque chose me dit que peut ne pas être juste.
Donc à la place j'ai fait mon tableau par l'allocation de la mémoire pour un pointeur de char.
Je comprends que cette fonction est probablement waaaaay sous-optimale pour ce qu'il est en train de faire, mais ce que je veux vraiment savoir, c'est:
-
Pouvez-vous normalement l'initialisation d'un tableau à l'aide d'une variable à déclarer la longueur comme:
char garni[len];
Si j'avais un tableau qui a été de ce type (char garni[]) aurait-il le même type de retour comme un pointeur sur char (ie char*).
Si je fais mon tableau par l'allocation de la mémoire et de l'allouer à un pointeur de char, comment puis-je libérer cette mémoire. Il me semble qu'une fois j'ai retourné ce tableau, je ne peux pas accéder à la libre car il est une variable locale.