problema estrecho con char * a

incluir

#include  int main() { char *array[10]={}; char* token; token = "testing"; array[0] = "again"; strcat(array[0], token); } 

¿Por qué vuelve la falla de segmentación?

Estoy un poco confundido.

Técnicamente, esto no es válido C. (Sin embargo, es válido en C ++).

 char *array[10]={}; 

Deberías usar

 char *array[10] = {0}; 

Esto declara una matriz de 10 punteros a char y los inicializa a punteros nulos.

 char* token; token = "testing"; 

Esto declara el token como un puntero a char y lo apunta a un literal de cadena que no es modificable.

 array[0] = "again"; 

Esto apunta el primer puntero char de la array a un literal de cadena que (de nuevo) es una secuencia de char no modificable.

 strcat(array[0], token); 

strcat concatena una cadena al final de otra cadena. Para que funcione, la primera cadena debe estar contenida en el almacenamiento grabable y tener suficiente almacenamiento en exceso para contener la segunda cadena en y más allá del primer carácter nulo de terminación (‘\ 0’) en la primera cadena. Ninguno de estos se mantiene para la array[0] que apunta directamente a la cadena literal.

Lo que necesitas hacer es algo como esto. ( #include y .)

He optado por el cálculo en tiempo de ejecución de los tamaños y la asignación dinámica de memoria, ya que asumo que está realizando una prueba para determinar dónde las cadenas no serán de un tamaño conocido en el futuro. Con las cadenas conocidas en tiempo de comstackción, puede evitar parte (o la mayoría) del trabajo en tiempo de comstackción; pero entonces también puedes hacer "againtesting" como un literal de una sola cadena.

 char* token = "testing"; char* other_token = "again"; /* Include extra space for string terminator */ size_t required_length = strlen(token) + strlen(other_token) + 1; /* Dynamically allocated a big enough buffer */ array[0] = malloc( required_length ); strcpy( array[0], other_token ); strcat( array[0], token ); /* More code... */ /* Free allocated buffer */ free( array[0] ); 

Cómo funciona esto: char *array[10] es una matriz de 10 char * punteros (básicamente 10 mismas cosas que token ).

token = "testing" crea espacio estático en algún lugar de la memoria de su progtwig en el momento de la comstackción, y pone “testing” allí. Luego, en tiempo de ejecución , pone la dirección a esa “prueba” estática en el token .

array[0] = "again" hace básicamente lo mismo.

Luego, strcat(array[0], token) toma la dirección en array[0] e intenta agregar el contenido del token a la cadena en esa dirección. Lo que le da segfault, ya que la array[0] apunta a un segmento de datos de solo lectura en su memoria.

Cómo hacer esto correctamente:

 char * initial = "first"; // pointer to static "first" string char * second = "another"; // another one char string[20]; // local array of 20 bytes strcpy(string, initial); // copies first string into your read-write memory strcat(string, second); // adds the second string there 

En realidad, si no quieres dispararte en el pie, la mejor manera de hacer algo como las dos últimas líneas es:

 snprintf(string, sizeof(string), "%s%s", initial, second); 

snprintf entonces se asegura de que no uses más de 20 bytes de string . strcat y strcpy felizmente rebasarían el límite a la memoria inválida y causarían otro fallo de seguridad en el tiempo de ejecución o algo peor (piense en las vulnerabilidades de seguridad) si la cadena copiada fuera más larga que el espacio de destino.

Para crear una matriz de caracteres, char *array[10]={}; en su lugar debería ser char array[10]={};

el error de segmentación se produce porque la matriz [0] apunta a “otra vez”, un literal de cadena y la modificación de los literales de cadena es un no-no (comportamiento indefinido)

Si planea cambiar las cadenas involucradas, realmente debería asignar suficiente memoria para lo que necesita. Por ejemplo, en lugar de char *token; token = "testing"; char *token; token = "testing"; podría usar, diga char token[20] = "testing"; , que deja espacio suficiente para una cadena de 19 caracteres (más el byte nulo al final).

De manera similar, puede usar char array[10][20] = {"testing"}; para crear una matriz de 10 cadenas y configurar la primera para probar.

Estás poniendo una cadena en la array[0] que es solo un carácter. Use array[0]='a' como este.