You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组实现栈时extern变量初始化报错问题求助

数组实现栈时extern变量初始化冲突的解决方法

问题重现

尝试用C语言实现数组版栈,编写的代码及编译报错如下:

push操作代码(0-push_arr_stack.c)

#include "stack.h"

/**
 * push_arr_stack - pushes an element to the stack
 * @n: The number that will be pushed to the stack
 * 
 * Return: It returns nothing
 * 
 */
void push_arr_stack(int n)
{
    top = top + 1;
    stack_arr[top] = n;    
}

头文件(stack.h)

#ifndef STACK_H
#define STACK_H
#define MAX 4

extern int stack_arr[MAX];
extern int top = -1;

void push_arr_stack(int n);

#endif 

测试主函数(main.c)

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include "stack.h"

/**
 * main - Entry point for my program
 * 
 * Return: On success, it returns 0,
 * On error, it returns -1
 */
int main(void)
{
    push_arr_stack(7);
    return (0);
}

编译错误信息

gcc -Wall -Werror -Wextra -pedantic -std=gnu89 main.c 0-push_arr_stack.c

In file included from main.c:4:
stack.h:6:12: error: ‘top’ initialized and declared ‘extern’ [-Werror]
    6 | extern int top = -1;
      |            ^~~
cc1: all warnings being treated as errors
In file included from 0-push_arr_stack.c:1:
stack.h:6:12: error: ‘top’ initialized and declared ‘extern’ [-Werror]
    6 | extern int top = -1;
      |            ^~~
cc1: all warnings being treated as errors

错误原因

C语言中,extern的作用是声明变量(告知编译器该变量在其他文件中定义),而非定义变量。如果给extern变量添加初始化值,会强制将其转为变量定义(等同于去掉extern的普通变量定义)。当多个源文件包含该头文件时,会导致top被多次定义,同时违反extern的使用规则,触发编译报错。

修正方案

需将变量的声明与定义彻底分离:

1. 修改头文件stack.h

仅保留extern声明,移除初始化操作:

#ifndef STACK_H
#define STACK_H
#define MAX 4

// 仅声明变量,告知编译器变量在其他文件中定义
extern int stack_arr[MAX];
extern int top;

void push_arr_stack(int n);

#endif 

2. 在单个源文件中定义并初始化变量

选择一个源文件(比如0-push_arr_stack.c)完成变量的唯一定义与初始化:

#include "stack.h"

// 全局变量的定义与初始化,确保仅在该文件中出现一次
int stack_arr[MAX];
int top = -1;

/**
 * push_arr_stack - pushes an element to the stack
 * @n: The number that will be pushed to the stack
 * 
 * Return: It returns nothing
 * 
 */
void push_arr_stack(int n)
{
    top = top + 1;
    stack_arr[top] = n;    
}

3. 额外优化:添加栈满检查

为避免数组越界,push操作应先判断栈是否已满:

void push_arr_stack(int n)
{
    if (top >= MAX - 1) {
        printf("Stack overflow!\n");
        return;
    }
    top = top + 1;
    stack_arr[top] = n;    
}

修改完成后重新编译即可正常运行,top变量会被正确初始化为-1以跟踪栈顶索引。


内容的提问来源于stack exchange,提问作者Leuel Asfaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:40:31