指向多个源文件之间共享的数组的指针

时间:2013-07-24 19:31:26

标签: c gcc gcc4

这是我的文件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:警告:数组'days'假定有一个元素
  根@其中:〜/天   分段错误

如果你向我解释这个结果,我将不胜感激。

我的问题:

  • 在多个源文件中声明变量(包括数组)的正确方法是什么?
  • 当在不同的文件中声明数组元素时,如何使用指针访问数组元素?

3 个答案:

答案 0 :(得分:5)

对象的标识符的每个声明必须与其他声明具有兼容的类型。 int *daysint days[]是不同的类型。前者是指向int的指针。后者是int的数组。

在第一个文件中,使用:

int *days;

在第二个文件中,使用:

extern int *days;

此外:int *days;days暂定定义。当编译器到达转换单元的末尾(正在编译的源文件)时,它会将暂定定义更改为对象的定义(初始化程序为零)。 extern int *days;days声明,不是定义。它告诉编译器days是存在于其他地方的对象的名称。

每个对象应该只有一个定义。引用该对象的其他文件应该只声明名称而不是定义对象。

有时会对int days[]等声明产生混淆,因为在函数参数中使用此声明会将参数声明为int *类型。这是一种特殊调整,仅在函数参数中发生,而不在其他声明中发生。

答案 1 :(得分:1)

分段错误的原因:

int days[]; // is errror 
void ChangeDay(void)
{
    days[0] = 31;
}

声明这是错误int days[];,你没有给它大小并初始化它。所以你不能使用 day[0] = 31; - 这是非法的,会导致细分错误。

要获取错误而不是警告,请编译代码,如:

gcc -pedantic -error然后它只会给你一个错误。

否则此代码不会给您一个错误,令人困惑,但请检查此代码是否正常Codepade。如果你按照我的建议编译正确的标志,这段代码会给你一个错误。

此外,正如您想要共享相同的day[]数组一样,按照@Eric Postpischil

的建议声明它

我现在没有删除我的答案,因为我希望其他用户查看链接代码@ codepade并告诉我是否应该使用新的编译器进行编译?或者是编译器中的错误?

答案 2 :(得分:0)

您必须在一个c文件中声明该数组,并在另一个c文件中将该变量声明为extern。