2010-04-18 10 views
7

Tengo curiosidad de por qué esto es un error y qué significa el mensaje de error. Aquí hay un código:¿Qué está sucediendo con los punteros en este fragmento?

int *x[] = {"foo", "bar", "baz"}; 
int *y[] = {"foo", "bar", "baz"}; 

x = y; 

intento compilar y me sale esto:

error: incompatible types when assigning to type ‘char *[3]’ from type ‘char **’ 

Pregunta # 1 ¿Por qué es esto un error? y Pregunta # 2 ¿por qué los tipos son diferentes?

+10

¿Por qué está almacenando cadenas de caracteres en matrices que contienen punteros enteros? –

+0

¿Marcó el número de línea? – SLaks

Respuesta

5

Como está escrito, hay bastantes problemas. En primer lugar, los literales de matriz son del tipo char*[], mientras que x y y son del tipo int*[]. En segundo lugar, no puede asignar matrices directamente, ya que de hecho son punteros constantes.

+2

Realmente me gustaría que este meme muriera. Las matrices no son punteros constantes, no son ningún tipo de puntero, son matrices (una secuencia contigua no vacía de objetos del mismo tipo). – caf

+1

Una variable cuyo tipo es una matriz en C sigue una semántica muy similar a los punteros constantes. Es lo mismo con la gravedad, seguro, no es realmente constante en todo el mundo, y no es realmente una fuerza descendente. No obstante, es útil considerar ambos aspectos verdaderos para la gran mayoría de los usos. –

3

Hay un tipo de error incompatible porque está asignando matrices de cadenas (escriba char * en C) a matrices de punteros a ints (como int *x[]). El mensaje de error dado por el compilador es un poco confuso porque C hace muchas cosas entre bastidores para tratar de convertir variables de un tipo a otro.

Como los caracteres se representan internamente como números (las letras corresponden a sus valores ASCII), C puede convertir los caracteres en enteros, por lo que intenta tratar las variables xey como matrices de punteros a caracteres en lugar de enteros, de ahí el char *[3]. Ve {"foo", "bar", "baz"} como tipo char ** porque las cadenas son del tipo char * y las matrices esencialmente se almacenan como punteros en C, por lo que es un puntero a char * o char **.

Si bien esto no se relaciona por completo con su pregunta, también me pregunto qué está tratando de hacer con x = y; Como está escrito, eso hará que x señale la misma matriz que y, dejando la matriz que x utilizó para señalar a inaccesible. Para verificar si dos variables en C son iguales, usaría el operador ==. Probar la igualdad no es tan simple para arreglos o cadenas, pero eso está completamente fuera del alcance de esta pregunta.

0

Recomiendo comenzar con un buen tutorial sobre punteros y matrices. Parece que proviene de un lenguaje interpretado como JavaScript o PHP. Las cosas son bastante diferentes en C, y necesitas manejar las nociones de memoria de pila, memoria de montón, punteros, etc. Una vez que hagas esto, todo tendrá sentido y serás cariñoso C.

2

Es un error, porque una matriz es un lvalue no modificable, lo que significa que no puede asignarle directamente. Solo puede modificar los miembros de la matriz individualmente.

Los tipos son diferentes porque si una matriz se utiliza en un contexto donde no se requiere un lvalue, se evalúa como un puntero a su primer elemento (somearray se convierte efectivamente en &somearray[0]).

Desde la matriz y se utiliza en este contexto, se evalúa como la dirección de su primer elemento, que tiene el tipo int **. Desde la matriz xes en un contexto lvalue, se evalúa como una matriz (int *[3]). (Su mensaje de error en realidad no coincide con su código; sospecho que sus arrrays son en realidad matrices de char *).

("lvalue contexto" significa, más o menos, uno de: El lado izquierdo mano de un operador de asignación (que es donde el nombre proviene de), el objeto de que el operador sizeof; o el sujeto del operador &) .

0

por alguna razón no puedo usar la misma cuenta con la que publiqué la pregunta.

La cosa "int" era un error tipográfico de mi parte, realmente quise que fuera "char". Perdón por la confusion.

Sin embargo, creo que caf respondió mi pregunta.

"Es un error, porque una matriz es un lvalue no modificable, lo que significa que no se puede asignar directamente. Solo se pueden modificar los miembros de la matriz individualmente".

Estoy tratando de entender cómo funcionan los punteros en c, es por eso que estoy probando estas cosas al azar que probablemente no harías normalmente. Pensé que esto podría funcionar, ya que pensé en matrices = punteros, así que podría hacer que x apunte a y. ¿Supongo que no?

Gracias por toda su respuesta chicos.

Cuestiones relacionadas