malloc y libre de una matriz de caracteres -- beginner campo con c campo con strings campo con reinventing-the-wheel campo con pointers camp codereview Relacionados El problema

malloc and free of a char-array


1
vote

problema

Español

Escribí una función para revertir una matriz de caracteres (cadena). Dado que soy principiante y no trabajamos con malloc y las cosas antes, tal vez alguien pueda echar un vistazo, si esto está bien, ¿qué estoy haciendo aquí?

  char* reverse_string(char* string) {     // getting actual length of the string     size_t length = strlen(string);      // allocate some space for the new string     char* new_string = malloc(sizeof(char)*(length+1));      // index for looping over the string     int actual_index = 0;      // iterating over the string until ''     while(string[actual_index] != '')          new_string[length-actual_index-1] = string[actual_index++];      // setting the last element of string-array to ''      new_string[length] = '';      // free up the allocated memory     free(new_string);      // return the new string     return new_string; }   
Original en ingles

I wrote a function to reverse a char-array (string). Since I'm beginner and didn't work with malloc and stuff before, maybe someone could take a look, if this is fine, what I'm doing here?

char* reverse_string(char* string) {     // getting actual length of the string     size_t length = strlen(string);      // allocate some space for the new string     char* new_string = malloc(sizeof(char)*(length+1));      // index for looping over the string     int actual_index = 0;      // iterating over the string until '\0'     while(string[actual_index] != '\0')          new_string[length-actual_index-1] = string[actual_index++];      // setting the last element of string-array to '\0'      new_string[length] = '\0';      // free up the allocated memory     free(new_string);      // return the new string     return new_string; } 
              

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Aquí hay algunas cosas que pueden ayudarlo a mejorar su código.

arreglar el error

Una vez que se libera la memoria, no debe ser referenciado nuevamente. Desafortunadamente, su código asigna la memoria y luego lo libera y luego devuelve un puntero a la memoria liberada. ¡Es un error serio! Para solucionarlo, simplemente omita el free dentro de la función y asegúrese de que la persona que llama llama free en su lugar. Alternativamente, podría evitar todo eso invirtiendo la cadena pasada en su lugar.

Utilice el #include S

El código utiliza strlen , lo que significa que debería 9988777665544334 y 9988777665544335 998877665554433665544336 significa que debería #include <stdlib.h> . No fue difícil inferir, pero ayuda a los revisores si se completa el código.

Uso const Donde sea práctico

En su rutina revere_string , la cadena pasada a la función no es y no debe modificarse. Debe indicar ese hecho declarándolo así:

  free0  

Compruebe por free1 Punters

El código DEBE EVITAR DEREENENCIAR UN PUNTADOR NULL Si la llamada a free2 falla. La única indicación de que ha fallado es si free3 devuelve free4 ; Si lo hace, probablemente tenga la mayoridad de regresar inmediatamente ese puntero nulo.

Aprenda a usar los punteros en lugar de la indexación

Usando los punteros de manera efectiva es una habilidad importante de programación de C. Este código podría hacerse mucho más simple haciendo una inversión en el lugar de la cadena pasada y usando los punteros:

  free5  
 

Here are some things that may help you improve your code.

Fix the bug

Once memory is freed, it should not be referenced again. Unfortunately, your code allocates memory and then frees it and then returns a pointer to the freed memory. That's a serious bug! To fix it, simply omit the free within the function and make sure the caller calls free instead. Alternatively, you could avoid all of that by reversing the passed string in place.

Use the required #includes

The code uses strlen which means that it should #include <string.h> and malloc and free which means that it should #include <stdlib.h>. It was not difficult to infer, but it helps reviewers if the code is complete.

Use const where practical

In your revere_string routine, the string passed into the function is not and should not be altered. You should indicate that fact by declaring it like this:

char* reverse_string(const char* string) 

Check for NULL pointers

The code must avoid dereferencing a NULL pointer if the call to malloc fails. The only indication that it has failed is if malloc returns NULL; if it does, it would probably make most sense to immediately return that NULL pointer.

Learn to use pointers instead of indexing

Using pointers effectively is an important C programming skill. This code could be made much simpler by doing an in-place reversal of the passed string and by using pointers:

char* reverse_string(char* string) {     if (string == NULL)          return string;     char *fwd = string;     char *rev = &string[strlen(string)-1];      while (rev > fwd) {         char tmp = *rev;         *rev-- = *fwd;         *fwd++ = tmp;     }     return string; } 
 
 
 
 

Relacionados problema

4  (C ++ 14) Estado de manejo en la función C-Style Pointer Callbacks  ( C14 handling state in c style function pointer callbacks ) 
Tengo algunos problemas que se presentan con una solución sensible para usar el estado compartido en un puntero de función de estilo C. Estoy usando GLFW para...

7  Encontrando la primera carta recurrente en cada cadena de un conjunto dado  ( Finding first recurring letter in each string of a given set ) 
La primera entrada es el número de cadenas ex: 5 La segunda entrada es un conjunto de cuerdas ex: Hola mundo ¿Cómo estás Salga de la letra en la cadena EX:...

4  Generar todas las permutaciones en c  ( Generate all permutations in c ) 
He escrito código para generar todas las permutaciones en C como se explica aquí . ¿Cómo se puede optimizar el código? ¿Hay alguna fugas de memoria? int f...

3  Funciones de manipulación de comando para un programa de concha de juguete  ( Command manipulation functions for a toy shell program ) 
Estoy escribiendo un pequeño programa que se supone que actúa como una concha de algún tipo. Funciona de unas pocas estructuras básicas, una de ellas es un 9...

7  Pase los datos del puntero a través de múltiples funciones  ( Pass pointer data across multiple functions ) 
Me gustaría revisar en el siguiente proceso de asignación de memoria dinámica y sugerencias sobre si hay alguna fugas de memoria. El siguiente código no es un...

10  Clase personalizada para un ido prestado_ptr <t>?  ( Custom class for a borrowed unique ptrt ) 
En C ++ 11, tiendo a tener objetos maestros que mantienen la propiedad única de una colección de algunos objetos para niños. Asumamos que estos objetos para n...

6  Implementando un árbol binario en C ++ usando "Std :: ique_ptr"  ( Implementing a binary tree in c using stdunique ptr ) 
He implementado una clase de árbol de búsqueda binaria simple en C ++ usando Dim Wb1 As Workbook, Wb2 As Workbook Dim Wk4 As Worksheet, Wk5 As Wor...

1  Pasando objetos atómicamente a través de hilos sin cerraduras o carreras de datos para la sincronización de audio  ( Passing objects atomically across threads without locks or data races for audio ) 
Estoy aprendiendo sobre una de las partes más difíciles del desarrollo de audio: la sincronización entre el hilo de audio y el hilo GUI. Por la discusión aquí...

4  Creando una lista con una estructura en C  ( Creating a list using a struct in c ) 
Acabo de entrar en struct S y yo decidimos crear una lista usándolos: #include<stdio.h> #include<stdlib.h> int main(void) { char counter; struct...

19  Scoped_PTR para C ++ / CLI (asegúrese de que el objeto administrado libera correctamente el objeto nativo de propiedad)  ( Scoped ptr for c cli ensure managed object properly frees owned native object ) 
Motivar así: ¿Hay un C ++ / Proyecto CLI Smart Pointer (por ejemplo, scoped_ptr)? Estoy interesado en cualquier comentario crítico, y especialmente identi...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos