2009-11-24 11 views
30

estoy centrado específicamente en cuando usar malloc sobre los punteros de charde usar malloc para los punteros de char

char *ptr; 
ptr = "something"; 
...code... 
...code... 
ptr = "something else"; 

sería un malloc para que algo tan trivial como esto? ¿Si es así por qué? Si no, ¿cuándo es necesario para los indicadores de char?

Respuesta

30

Como se ha indicado por los demás, no es necesario utilizar malloc justo hacer

const char *foo = "bar"; 

La razón de esto es exactamente lo que *foo es un puntero cuando — initialize foo no está creando una copia de la cadena, solo un puntero al lugar donde "bar" vive en la sección de datos del ejecutable. Puedes copiar ese puntero todas las veces que quieras, pero recuerda que siempre apuntan hacia la misma instancia de esa cadena.

Entonces, ¿cuándo deberías usar malloc? Normalmente utiliza strdup() para copiar una cadena, que maneja el malloc en el fondo. p.ej.

const char *foo = "bar"; 
char *bar = strdup(foo); /* now contains a new copy of "bar" */ 
printf("%s\n", bar);  /* prints "bar" */ 
free(bar);    /* frees memory created by strdup */ 

Ahora, por fin tenemos en torno a un caso en el que es posible que desee malloc si está usando sprintf() o, de forma más segura snprintf() que crea/formatea una nueva cadena.

char *foo = malloc(sizeof(char) * 1024);  /* buffer for 1024 chars */ 
snprintf(foo, 1024, "%s - %s\n", "foo", "bar"); /* puts "foo - bar\n" in foo */ 
printf(foo);         /* prints "foo - bar" */ 
free(foo);          /* frees mem from malloc */ 
+0

¿Qué podría pasar con: char * foo = "bar"; char * bar = foo; printf ("% s \ n", barra); – ZPS

+1

Primero, debería ser 'const char * foo ...', segundo, en su ejemplo que solo copia el puntero, no los datos. 'strdup()' también copia los datos. – scotchi

+0

Se propuso una edición aquí lanzando el resultado del malloc a '(char *)'. Esto es necesario cuando este código se usa en C++, pero generalmente este código * no debe * usarse en C++, por lo que revertí la edición. – scotchi

9

malloc es para asignar memoria en la tienda libre. Si usted tiene una cadena literal que no desea modificar el siguiente está bien:

char *literal = "foo"; 

Sin embargo, si usted quiere ser capaz de modificarlo, usarlo como un amortiguador para mantener una línea de entrada y por lo , tendrá que utilizar malloc:

char *buf = (char*) malloc(BUFSIZE); /* define BUFSIZE before */ 
// ... 
free(buf); 
4

uso malloc() cuando no se sabe la cantidad de memoria necesaria durante el tiempo de compilación. En caso de que tenga cadenas de solo lectura, puede usar const char* str = "something";. Tenga en cuenta que la cadena probablemente se almacene en una ubicación de memoria de solo lectura y no podrá modificarla. Por otro lado, si conoce la cadena durante el tiempo de compilación, puede hacer algo como: char str[10]; strcpy(str, "Something"); Aquí la memoria se asigna desde la pila y podrá modificar la cadena. El tercer caso es asignar usando malloc. Digamos que no conoce la longitud de la cadena durante el tiempo de compilación. A continuación, puede hacer char* str = malloc(requiredMem); strcpy(str, "Something"); free(str);

1

Cada vez que el tamaño de la cadena no se ha determinado en tiempo de compilación que tiene que asignar memoria con malloc (o algún método equiviallent). En su caso, usted conoce el tamaño de sus cadenas en el momento de la compilación (sizeof ("something") y sizeof ("something else")).

2

malloc para caracteres individuales o enteros y calloc para matrices dinámicas. es decir pointer = ((int *)malloc(sizeof(int)) == NULL), puede hacer operaciones aritméticas dentro de los corchetes de malloc pero que no deberían, ya que deberá utilizar calloc que tiene la definición de void calloc(count, size) lo que significa que el número de elementos que desea almacenar es decir, contar y tamaño de los datos, es decir, int, etc. char

Cuestiones relacionadas