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

如何在C语言函数中正确修改全局变量的值?

问题根本原因

你遇到的输出为0的问题和是否用指针修改全局变量无关,全局变量本身就可以在函数内直接修改,错误出在你的判断逻辑和数组访问逻辑上:

  • 你用textbuffer[i].statement == NULL做判断是完全错误的:statement是结构体里的字符数组,数组名是固定的首地址,永远不可能等于NULL,所以判断永远不生效,全局变量free_head、inuse_head没有被正确赋值,默认初始值就是0。
  • 数组越界:textbuffer定义长度为25,合法下标范围是0~24,你循环写i<=25会访问越界,触发未定义行为。
  • 缺少判断空字符串的正确逻辑:全局数组的statement初始默认全为0,也就是空字符串,你应该用textbuffer[i].statement[0] == '\0'判断该位置是否未被使用。

修正后的代码

#include <stdio.h>
#include <string.h>

struct node
{
    char statement[40];
    int next;
};
struct node textbuffer[25];

int free_head;
int inuse_head;

void insert(int line, char* stat)
{
    FILE *file;
    file=fopen("deneme.txt","a");
    
    if(file!=NULL)
    {
        int i;
        int k;
        
        strcpy(textbuffer[line].statement,stat);
        textbuffer[line].next=line+1;
        fprintf(file,"%s",textbuffer[line].statement); // 此处额外修正,防止stat含格式符触发安全问题
        
        // 找第一个未使用的节点作为free_head
        for(i=0;i<25;i++) // 修正循环范围
        {
            if(textbuffer[i].statement[0] == '\0') // 修正判断条件
            {
                free_head=i;
                break;
            }
        }
        
        // 找第一个已使用的节点作为inuse_head
        for(k=0;k<25;k++) // 修正循环范围
        {
            if(textbuffer[k].statement[0] != '\0') // 修正判断条件
            {
                inuse_head=k;
                break;
            }
        }
    }
    else
    {
        printf("File couldn't found.");
    }
    fclose(file);
}


int main()
{
    insert(3,"Hello World");
    printf("free list: %d and inuse list: %d",free_head,inuse_head);
    return 0;   
}

运行结果说明

修正后运行会输出free list: 0 and inuse list: 3,符合预期:你在insert里给下标3的位置赋值了内容,所以第一个已使用的位置是3,第一个未使用的位置是0。

如果后续你想把这两个变量改为局部变量而非全局,确实需要用指针传参的方式修改值,可以参考以下写法:

// 修改函数定义,接收两个int指针参数
void insert(int line, char* stat, int *free_head_p, int *inuse_head_p)
{
    // 其余逻辑不变
    // 赋值时解引用指针
    *free_head_p = i;
    // 其余逻辑不变
    *inuse_head_p = k;
}

// 调用时传入变量地址
int main()
{
    int free_head = 0, inuse_head = 0;
    insert(3, "Hello World", &free_head, &inuse_head);
    printf("free list: %d and inuse list: %d",free_head,inuse_head);
    return 0;
}

内容的提问来源于stack exchange,提问作者Oğulcan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 08:15:01