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

标签 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: warning: array ‘days’ assumed to have one element
root@where:~./day Segmentation fault

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

我的问题:

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

最佳答案

对象标识符的每个声明都必须具有与其他声明兼容的类型。 int *daysint 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/

相关文章:

c - 如何使用 libnl-route 设置 netem qdisc 和 tbf qdisc?

C::how:运行错误检查循环中的字符串是否太长

c++ - AIX 上的 std::locale::operator=(std::locale const&) 崩溃

c - gcc4.7 错误 - 取消引用类型双关指针

portability - 在 CentOS/RHEL 4.8 上使用 gcc 4.x 构建的应用程序会在完全未更新的 CentOS/RHEL 4 上运行吗?

c - 是否可以使用泛型而不是仅使用整数在 C 中实现 StackADT?

CPU 操作 windows profiler 工具

android - 交叉构建 native 编译器问题 : Segfaults in Compiler or Compiled Binary

C++:所有 boost 路径操作段错误 (OSX/GCC)

c - 链接多个 C 源文件