2011-04-05 8 views
5

Estoy intentando crear un puntero a uno de los argumentos main() en mi programa. Configuré el puntero inicial, luego lo configuré igual al segundo elemento de la matriz, pero recibo un error cuando intento compilar, fallo de segmentación. ¿Esto ocurre porque un puntero apunta a una dirección incorrecta?Extrayendo cadena de argumentos principales()

Aquí está el código:

char *filename; 
*filename = argv[1]; 
printf("The filename is: %s", *filename); 

recibo errores sobre el puntero tratando de emitir el argumento como un int. ¿Esto es porque el puntero es en realidad un valor de dirección entero y estoy tratando de establecerlo igual a una cadena?

Editar: Cuando cambio a "filename = argv [1]", entonces obtengo el siguiente error de mi compilador: la tarea descarta los calificadores del tipo de destino del puntero.

Respuesta

7

No es posible que haya un error de segmentación al compilar. A menos que, bueno, el compilador viole la seguridad de la memoria, lo cual es poco probable. Consideraré que sucede cuando ejecutas el programa: D.

El problema está aquí:

*filename = argv[1]; 

que debe ser:

filename = argv[1]; 

¿Por qué? Has declarado un puntero al char, unificado, sin llegar a ninguna parte en particular. Luego, desreferencia ese puntero y datos asignados a esa posición de memoria. ¿Cuál es, bueno, quién sabe dónde?

Editar: también eliminar la referencia filename en la llamada printf(). Quite eso * :).

Además, ¿el compilador no disparó una advertencia cuando asignó * nombre de archivo? Hacer un entero desde el puntero sin un molde, sería mi suposición? Preste atención a las advertencias, ¡proporcionan información útil!

Saludos.

+1

Asimismo 'printf ("El nombre de archivo es:% s", nombre de archivo);'. El especificador '% s' espera un carácter * puntero *. – dmckee

+0

Cuando cambio a "filename = argv [1]", recibo el siguiente error de mi compilador: la tarea descarta los calificadores del tipo de destino del puntero. – Kelp

+1

@Kelp: define main con 'int main (int argc, char ** argv)' o 'int main (int argc, char * argv [])'. – pmg

3

En la instrucción *filename = argv[1];, la expresión *filename intenta desreferenciar (encuentre el valor señalado) del puntero filename, que todavía no está apuntando a ninguna parte significativa.

Cambia la asignación a filename = argv[1].

4

No está haciendo que filename señale el mismo lugar que argv[1]. Para ello es necesario

filename = argv[1]; 

con tu versión (*filename = argv[1];) que está tratando de hacer que cualquier nombre de archivo puntos tengan el valor que está en argv [1]. Hay muchas cosas mal con esto: a) el nombre de archivo no se inicializa y puede apuntar a cualquier lugar, incluso a ubicaciones no válidas; b) argv[1] es del tipo char* y está intentando colocarlo en una ubicación del tipo char!

0

Está desreferenciando el carácter * cuando intenta asignarlo, por lo que está tratando de meter un puntero en un carácter. Y dado que el nombre del archivo no está inicializado, intentas acceder a alguna dirección aleatoria (o tal vez a la dirección 0x00000000).Y su extracto impreso, si llegó tan lejos, tampoco funcionaría: está desremarcando el carácter * (para obtener un carácter) y luego diciéndole a printf que lo interprete como un puntero a una cadena terminada en nulo.

Prueba esto:

char *filename ; 
filename = argv[1] ; 
printf("The filename is: %s" , filename) ; 
Cuestiones relacionadas