Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

267
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!