这是我的文件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'假定有一个元素
根@其中:〜/天 分段错误
如果你向我解释这个结果,我将不胜感激。
我的问题:
答案 0 :(得分:5)
对象的标识符的每个声明必须与其他声明具有兼容的类型。 int *days
和int 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。