如何在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
相关产品推荐
相关产品推荐

