sirven que punteros puntero parametros para los funciones ejemplos declaracion como cadenas arreglos aritmetica c segmentation-fault

que - punteros y arreglos en c



Error de segmentación-puntero de char (4)

Estas dos líneas:

char* num = (char*)malloc(100); num = "123456";

tiene el siguiente efecto.

El primero asigna 100 bytes y establece num a punto a esos bytes.

El segundo cambia num para apuntar a la cadena "123456", que es casi seguro en la memoria de solo lectura.

Cualquier intento de cambiar el contenido de la memoria de solo lectura dará como resultado una violación de segmentación. Debe copiar la cadena en el número de malloc antes de intentar cambiarlo, con:

strcpy (num, "123456");

Esa es la línea que debería tener donde tiene actualmente:

num = "123456";

En el código a continuación, la línea:

*end = *front;

da una falla de segmentación Hice una pregunta similar aquí, pero no estoy seguro de si esto es porque tengo dos copias de num. Por favor explica por qué es seg-faulting. Gracias.

#include <stdio.h> #include <stdlib.h> #include <string.h> char* getPalin(char* num); int main() { char* num = (char*)malloc(100); num = "123456"; printf("%s/n", getPalin(num) ); return 0; } char* getPalin(char* num) { int length = strlen(num); if ( length % 2 == 0 ) { char* front = num; char* end = num + strlen(num) - 1; //pointer to end while( front != num + (length/2) ) //pointers not middle yet { *end = *front; printf("%c", *end); front++; end--; } } return num; }


Según la respuesta de Konstantin.

Ya ha asignado memoria para num con la instrucción malloc.

Si no lo hubiera hecho, podría salirse con la suya:

char* num = "123456";

Lo que definiría y asignaría memoria sobre la marcha, pero lo más probable es que se asigne como una constante y, por lo tanto, de solo lectura.

Utilizar strncpy en lugar de strcpy para copiar "123456" asegurará que cualquier espacio adicional más allá del final del string null terminator también se inicialice como nulo, siempre que especifique n como 100 (para su ejemplo). De lo contrario, sin inicializar la memoria asignada por malloc a null (memset (num, 0, 100)), es concebible que pueda avanzar más allá del final de la cadena.

Oh casi lo olvidaste. Es recomendable usar strcpy_s o strncpy_s ya que son más seguros, aunque para tu código no importará.


Utilizar

strncpy(num, "123456", 100);

en lugar de

num = "123456";


El motivo del error es:

char* num = (char*)malloc(100);

En esta línea, ha declarado num como un puntero a una matriz o puntero a su primer elemento, no como una cadena.

num = "123456";

Esta línea usaste num como lo declaraste como una cadena. Esto es una violación de la segmentación y, por lo tanto, de la falla seg. La sintaxis preferible (correcta) para su código es:

char num[100]; strcpy(num,"123456"); //Even if you use num="123456"; here it would still be wrong

O

char* num = (char*)malloc(100); strcpy(num,"123456");

O

char num[100]={''1'',''2'',''3'',''4'',''5'',''6''};

Cualquiera de estos haría su trabajo.