这是我的文件 1,名为 main.c
#include <stdio.h>
#include <stdlib.h>
#define MONTHS 12
void ChangeDay(void);
int* days;
int main(void)
{
days = (int*) malloc(MONTHS * sizeof(int));
if(days != NULL)
ChangeDay();
else
return 1;
printf("%2d.\n", days[0]);
return 0;
}
全局变量 days 被声明为指向 int
类型的指针,并且
malloc
用于为12个整数分配空间。
这是我的文件 2,名为 day.c
int days[];
void ChangeDay(void)
{
days[0] = 31;
}
当函数 ChangeDay
被调用时,十进制值 31 被分配给数组 days 的第一个元素。
这是代码输出:
root@where:~gcc -m32 -Wall -o day main.c day.c
day.c:1: warning: array ‘days’ assumed to have one element
root@where:~./day Segmentation fault
如果你能解释一下这个结果,我将不胜感激。
我的问题:
- 跨多个源文件声明变量(包括数组)的正确方法是什么?
- 如何在不同文件中声明数组元素时使用指针访问它们?
最佳答案
对象标识符的每个声明都必须具有与其他声明兼容的类型。 int *days
和 int days[]
是不同的类型。前者是指向 int
的指针。后者是一个int
数组。
在第一个文件中,使用:
int *days;
在第二个文件中,使用:
extern int *days;
此外:int *days;
是 days
的暂定定义。当编译器到达翻译单元的末尾(正在编译的源文件)时,它会将暂定定义更改为对象的定义(具有零初始值设定项)。 extern int *days;
是 days
的声明,不是定义。它告诉编译器 days
是存在于其他地方的对象的名称。
每个对象应该只有一个定义。引用该对象的其他文件应该只声明名称而不定义对象。
有时对于诸如 int days[]
的声明会产生混淆,因为在函数参数中使用它会将参数声明为 int *
类型。这是一个特殊的调整,只发生在函数参数中,而不发生在其他声明中。
关于c - 指向多个源文件之间共享的数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17843229/