Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

266
Vistas
no se puede acceder a la matriz definida en un archivo externo, sin la palabra clave "externo"

Descubro que no importa cómo, no puedo acceder a una matriz definida en un archivo externo. Así que hago algunas pruebas simples como estas tanto en C como en C++:

Cª:

C Principal

 #include<stdio.h> #include<string.h> #include<stdlib.h> int func(); char arr[100]=""; int main() { for(int i=0;i<=9;++i){ func(); printf("%s\n",arr); } return 0; }

func.c

 #include<string.h> #include<stdio.h> extern char* arr; int func(){ strcat(arr,"hello"); // try to access arr here return 0; }

En C++:

principal.cpp

 #include<iostream> using namespace std; int func(); char arr[100]=""; int main() { for(int i=0;i<=10;++i){ func(); cout<<arr<<endl; } return 0; }

func.cpp

 #include<cstring> extern char* arr; int func(){ strcat(arr,"hello"); // try to access arr here return 0; }

Prueba bastante simple como puedes ver. No importa qué método use para acceder a una matriz en un archivo externo, obtuve una falla de segmentación.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

La vinculación de variables no es de tipo seguro.

El problema es que está definiendo el nombre "arr" para referirse a una matriz.
Suponiendo que la matriz se encuentra en la dirección 0x10, se parece a esto:

 Address 0x10 0x11 0x12 0x13 Content | 0 | 0 | 0 | 0 | (... 100 zeroes in total)

El nombre "arr" se refiere a la ubicación donde se almacena esta matriz.

En "func.cpp" (y "func.c" - funcionan exactamente igual) afirma, o declara , que el nombre "arr" se refiere a un puntero.
Esto es una mentira porque no es lo que usted definió, pero el compilador y el enlazador confían ciegamente en usted.

Esta mentira hace que el código en func interprete el valor almacenado en la dirección 0x10 como un puntero en lugar de una matriz.
Con punteros de 32 bits, eso sería

 Address 0x10 0x14 Content | 0 | 0 | (...)

Y cuando strcat a 0 , las cosas no van bien.

Si almacena algo más distinto que los ceros en la matriz (por ejemplo, "\1\2\3\4" ) y examina el puntero en un depurador, será más obvio que los elementos de la matriz se han "convertido" en el valor del puntero.

La solución es hacer el reclamo adecuado; ese arr es una matriz:

 extern char arr[];

(Tenga en cuenta que en las declaraciones de variables, a diferencia de los parámetros de funciones, char arr[] no es lo mismo que char* arr ).

over 4 years ago · Santiago Trujillo Denunciar

0

Usar

 extern char arr[];

en vez de

 extern char* arr;

Aunque una matriz se convierte implícitamente en un puntero en muchas situaciones en C, una matriz no es lo mismo que un puntero. Lo que tienes es un puntero, no una declaración. La declaración en func.c no coincide con la definición en main.c.

over 4 years ago · Santiago Trujillo Denunciar

0

Lo simple es que debe usar la palabra clave externa en ambos lugares.
en principal.c

 extern char arr[100]="";

y en func.c

 extern char *arr;

esto le dirá al compilador que arr es un nombre de variable externo, para que se pueda acceder a él en otros archivos.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda