【问题标题】:How to change global variables in a C function?如何更改 C 函数中的全局变量?
【发布时间】:2021-05-28 18:55:24
【问题描述】:

我正在用 C 编写一个简单的文本编辑器。我必须将 inuse_headfree_head 定义为全局变量。我需要更改函数中 2 个全局变量的值。这是我目前写的代码:

#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,textbuffer[line].statement);
        
        for(i=0;i<=25;i++)
        {
            if(textbuffer[i].statement==NULL)
            {
                free_head=i;
                break;
            }
        
        }
        
        for(k=0;k<=25;k++)
        {
            if(textbuffer[k].statement!=NULL)
            {
                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_headinuse_head 时,它们都打印 0。我需要在函数insert 中更改free_headinuse_head 的值。我想我应该用指针来处理它,但是如何处理呢?

【问题讨论】:

  • 您是否尝试过在调试器中逐行运行代码,同时监控所有变量的值,以确定您的程序在哪个点停止按预期运行?如果您没有尝试过,那么您可能想阅读以下内容:What is a debugger and how can it help me diagnose problems? 您可能还想阅读以下内容:How to debug small programs?
  • 代码在for(i=0;i&lt;=25;i++) if(textbuffer[i].statement==NULL) ... 中包含未定义的行为,因为索引25 超出了struct node textbuffer[25]; 的范围。
  • 这个if(textbuffer[i].statement == NULL) 永远不会是真的。 textbuffer[i].statement 是一个固定数组,它衰减到一个不是NULL 的指针。你是说if(strcmp(textbuffer[i].statement, "") == 0) 吗?

标签: c pointers variables


【解决方案1】:

这两个变量的值都为0 的原因并不是函数insert 无法访问这些变量。由于变量都是全局变量,函数insert 可以直接访问这两个变量,就像任何其他变量一样。因此没有必要使用指针来访问这些变量。

问题在于函数insert中的行

free_head=i;

永远不会被执行,并且行

inuse_head=k;

仅在k 的值为0 时执行一次。

这就是为什么两个变量的值都不会改变它们的值,并且在整个程序中都保持它们的初始值0

另外,值得注意的是你的程序有undefined behavior。正如在 cmets 部分中已经指出的那样,您正在访问数组 textbuffer 超出范围。

线

for(i=0;i&lt;=25;i++)

应该改为

for(i=0;i&lt;25;i++)

和线

for(k=0;k&lt;=25;k++)

应该改为:

for(k=0;k&lt;25;k++)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2012-03-02
    相关资源
    最近更新 更多