la inicialización hace un entero desde el puntero sin una conversión

Acabo de comenzar a aprender a progtwigr y me encontré con este error que dice así: “la inicialización hace un entero desde el puntero sin una conversión [habilitada por defecto]” ¿Cuál es el problema?

// This program pairs three kids with their favorite superhero #include  #include  main() { char Kid1[12]; // Kid1 can hold an 11-character name // Kid2 will be 7 characters (Maddie plus null 0) char Kid2[] = "Maddie"; // Kid3 is also 7 characters, but specifically defined char Kid3[7] = "Andrew"; // Hero1 will be 7 characters (adding null 0!) char Hero1 = "Batman"; // Hero2 will have extra room just in case char Hero2[34] = "Spiderman"; char Hero3[25]; Kid1[0] = 'K'; //Kid1 is being defined character-by-character Kid1[1] = 'a'; //Not efficient, but it does work Kid1[2] = 't'; Kid1[3] = 'i'; Kid1[4] = 'e'; Kid1[5] = '\0'; // Never forget the null 0 so C knows when the // string ends strcpy(Hero3, "The Incredible Hulk"); printf("%s\'s favorite hero is %s.\n", Kid1, Hero1); printf("%s\'s favorite hero is %s.\n", Kid2, Hero2); printf("%s\'s favorite hero is %s.\n", Kid3, Hero3); return 0; } 

 char Hero1 = "Batman"; 

debiera ser

 char Hero1[] = "Batman"; 

Un par de veces tienes algunos problemas:

 #include  #include  main() { char Kid1[12]; // Kid1 can hold an 11-character name // Kid2 will be 7 characters (Maddie plus null 0) char Kid2[] = "Maddie"; // Kid3 is also 7 characters, but specifically defined char Kid3[7] = "Andrew"; // Hero1 will be 7 characters (adding null 0!) char *Hero1 = "Batman"; //needs to be a pointer // Hero2 will have extra room just in case char *Hero2 = "Spiderman"; //needs to be a pointer char Hero3[25] Kid1[0] = 'K'; //Kid1 is being defined character-by-character Kid1[1] = 'a'; //Not efficient, but it does work Kid1[2] = 't'; Kid1[3] = 'i'; Kid1[4] = 'e'; Kid1[5] = '\0'; // Never forget the null 0 so C knows when the // string ends strcpy(Hero3, "The Incredible Hulk"); printf("%s\'s favorite hero is %s.\n", Kid1, Hero1); printf("%s\'s favorite hero is %s.\n", Kid2, Hero2); printf("%s\'s favorite hero is %s.\n", Kid3, Hero3); return 0; } 

Debe definir todos sus valores en la parte superior de la función, es una buena práctica de C.

Aparte de eso, señalé los problemas (y los corregí) con comentarios.

El problema es con char Hero1 = "Batman" :

  • Cuando utiliza una cadena de caracteres entre comillas dobles en el código, el comstackdor lo reemplaza con un puntero al principio del espacio de memoria en el que la cadena residirá durante el tiempo de ejecución.
  • Entonces, por char Hero1 = "Batman" , en realidad estás intentando asignar una dirección de memoria (que generalmente consiste en 32 o 64 bits de datos, dependiendo de tu sistema) en una variable de carácter (que generalmente almacena 8 bits de datos).

Para solucionar el problema, debe cambiarlo a una de las siguientes opciones:

  • char Hero1[] = "Batman"
  • char* Hero1 = "Batman"

Para su información, en los dos casos anteriores, la cadena "Batman" residirá en una sección de memoria de solo lectura durante el tiempo de ejecución.

Sin embargo, hay una diferencia notable entre estos dos casos:

  • Usando char Hero1[] , la cadena "Batman" se copiará en la stack cada vez que se llame a la función. La matriz Hero1 se iniciará en esa dirección y podrá cambiar el contenido de esa matriz en un punto posterior dentro de la función.
  • Al usar char* Hero1 , la cadena "Batman" no se copiará en la stack cada vez que se llame a la función. La variable Hero1 estará apuntando a la dirección original de la cadena, por lo tanto, no podrá cambiar el contenido de esa cadena en ningún punto dentro de la función.

Cuando la imagen ejecutable se genera a partir de su código, la cadena se coloca en la sección de códigos, que es una de varias secciones de memoria dentro del progtwig. El comstackdor luego reemplaza la llamada “asignación de cadena” por una llamada “asignación de enteros”.

Por ejemplo, char* x = "abc" se cambia a char* x = (char*)0x82004000 antes de comstackrse en el código objeto, donde 0x82004000 es la dirección (constante) de la cadena en el espacio de memoria del progtwig.

Cuando haces sizeof("abc") , la imagen ejecutable ni siquiera contendrá la cadena "abc" , ya que no hay una operación de “ejecución” en esta cadena.

No se genera ningún código objeto para sizeof : el comstackdor calcula este valor durante la comstackción y lo reemplaza de inmediato por una constante .

Puede mirar el archivo de mapa (intermedio) que generalmente se genera y ver que la cadena de entrada de ese sizeof operación no aparece en ninguna parte.