请在评论和其他答案中找到技术答案。
我提供代码(基于您的代码)来说明这些好的解释。
为了实现这个说明,我使用了各种静态(两种)、局部和全局变量。
(为了简单起见,我使用整数而不是指针。
差异仅在于缓冲区是否更改,这可能是您突出的困惑的答案的一部分。对于与此相关的已发生的情况和未发生的情况有评论。)
code2.c:
#include <stdio.h>
#include <stdlib.h>
// defining a pointer which is only visible from this file,
// to later be initialised to the return value of malloc()
static double *outd;
// defining an int which is only visible from this file,
// to later be initialised to some integer value
static int outI;
// define an int which is only visible from this file,
// but has an identically named twin in the other file
// (there be dragons)
static int unknownTwinI;
// defining a global int which is visible from main()
int globalI;
void init0(int len)
{
int i;
// initialise the pointer
// to the address of a buffer reserved for use via this pointer
outd=malloc(sizeof(double)*len);
// initialise the memory inside that buffer
for (i=0; i<len; i++)
{
outd[i]=0.0;
}
// initialise the int to a value
outI = 0;
// initialise the global int to a value
globalI = 5;
// initialise one of the two twins
unknownTwinI = 6;
}
// show the content of the buffer referenced by the pointer
// and the value of the integer
void showarray(int len, int iterno)
{
int i;
// make a function local, non-static integer
int locI =0; // this init happens every time the functin is executed
// make a function-local, but static integer
static int inI =0; // this init happens before the first execution of the function
printf("iteration %d, array is \n",iterno);
for (i=0; i<len; i++)
{
outd[i]=outd[i]+iterno; // "counting up" array contents
printf("%.2f ",outd[i]);// show
}
outI = outI + iterno; // "counting up" file-local integer value
printf(" outI:%d", outI); // show
inI = inI + iterno; // "counting up" the function-local static integer
printf(" inI:%d", inI); // show
locI = locI + iterno; // "single increase" the function-local integer
printf(" locI:%d", locI); // show
globalI = globalI + iterno; // "single increase" the function-local integer
printf(" globalI:%d", globalI); // show
unknownTwinI = unknownTwinI + iterno; // "single increase" the function-local integer
printf(" unknownTwinI:%d", unknownTwinI); // show
// Note that nothing here frees the buffer
// or changes the pointer (which would be highly questionable, thinking of the free() later
printf("\n");
}
void deletearray()
{
free(outd);
}
code1.c:
#include <stdio.h>
#include <stdlib.h>
void init0(int len);
void showarray(int len, int iterno);
void deletearray();
// declare the global integer, which is defined in code2.cabs
// (should be in a header.h,
// excuse me for taking a shortcut for only having two files to post)
extern int globalI;
// attempt to similarly declare some of the identifiers which cannot be accessed
extern double *outd;
extern int outI;
extern int inI;
extern int locI;
// define an int which is only visible from this file,
// but has an identically named twin in the other file
// (there be dragons)
static int unknownTwinI;
int main(int argc,char* argv[])
{
int i, len;
len=5;
// exception of an init outside of init0(),
// this one targets the twin in THIS file here
unknownTwinI =0;
// pointer gets address, buffer gets values
// integers (those not static to showarray) get values
init0(len);
for (i=0; i<7; i++)
{
// all kinds of counting gets done
// (only during the first execution
// the local static int initially has the init value)
showarray(len,i);
// demonstrating that the global integer is accessable
globalI = globalI * 2;
// the showarray outputs the value of the twin in the other file,
// attempting to resist/undo the cumulative changes done there
unknownTwinI =0;
// (resistance is futile)
// these are forbidden accesses,
// with the warnings you get WITHOUT trying to declare them
// outd=NULL; // 'outd' undeclared (first use in this function)
// outI=0; // 'outI' undeclared (first use in this function)
// inI = 0; // 'inI' undeclared (first use in this function)
// locI =0; // 'locI' undeclared (first use in this function)
// these are the forbidden accesses again,
// with the warnings you get WITH trying to declare them
// outd=NULL; // undefined reference to `outd'
// outI=0; // undefined reference to `outI'
// inI = 0; // undefined reference to `inI'
// locI =0; // undefined reference to `locI'
}
deletearray();
return 0;
}
Output:
iteration 0, array is
0.00 0.00 0.00 0.00 0.00 outI:0 inI:0 locI:0 globalI:5 unknownTwinI:6
iteration 1, array is
1.00 1.00 1.00 1.00 1.00 outI:1 inI:1 locI:1 globalI:11 unknownTwinI:7
iteration 2, array is
3.00 3.00 3.00 3.00 3.00 outI:3 inI:3 locI:2 globalI:24 unknownTwinI:9
iteration 3, array is
6.00 6.00 6.00 6.00 6.00 outI:6 inI:6 locI:3 globalI:51 unknownTwinI:12
iteration 4, array is
10.00 10.00 10.00 10.00 10.00 outI:10 inI:10 locI:4 globalI:106 unknownTwinI:16
iteration 5, array is
15.00 15.00 15.00 15.00 15.00 outI:15 inI:15 locI:5 globalI:217 unknownTwinI:21
iteration 6, array is
21.00 21.00 21.00 21.00 21.00 outI:21 inI:21 locI:6 globalI:440 unknownTwinI:27