C语言:如何修改传入函数的结构体数组指针内的字符数组值?
问题解决:C语言中修改传入函数的结构体数组指针内的字符数组值
你的代码核心问题是**Element * data[amountOfLines]是一个指针数组,但数组内的每个指针都未指向有效内存空间**,直接通过(*data[i]).title访问相当于操作野指针,必然导致程序崩溃或卡住。下面提供两种可行的修改方案:
方案一:使用结构体数组(简单直接)
直接定义结构体数组而非指针数组,每个结构体的title字符数组自带固定内存,无需手动分配。
修改后的完整代码:
#include<string.h> #include<stdlib.h> #include<stdio.h> const int amountOfLines = 100, maxLineLength = 150; typedef struct Element Element; struct Element{ char title[60]; }; // 函数参数改为结构体数组(传参时会退化为指针) void parsingFile(FILE * file, Element data[amountOfLines]); int main(){ FILE * ignData = fopen("t4_ign.csv", "r"); // 直接定义结构体数组 Element data[amountOfLines]; // 检查文件是否打开成功 if(ignData == NULL){ perror("Failed to open file"); return 1; } parsingFile(ignData, data); fclose(ignData); // 记得关闭文件 } void parsingFile(FILE * file, Element data[amountOfLines]){ for(int i = 0; i < 1; i++){ char buffer[maxLineLength]; // 检查行读取是否成功 if(fgets(buffer, maxLineLength, file) == NULL){ break; } char * token = strtok(buffer, ","); // 确保token有效再拷贝,避免空指针操作 if(token != NULL){ // 用strncpy代替strcpy,防止缓冲区溢出 strncpy(data[i].title, token, sizeof(data[i].title)-1); data[i].title[sizeof(data[i].title)-1] = '\0'; // 手动添加字符串结束符 printf("%s is the title\n", data[i].title); } } }
方案二:使用指针数组(需动态分配内存)
如果必须用指针数组,需要提前为每个指针分配结构体内存,确保访问的是有效空间。
修改后的完整代码:
#include<string.h> #include<stdlib.h> #include<stdio.h> const int amountOfLines = 100, maxLineLength = 150; typedef struct Element Element; struct Element{ char title[60]; }; void parsingFile(FILE * file, Element * data[amountOfLines]); int main(){ FILE * ignData = fopen("t4_ign.csv", "r"); Element * data[amountOfLines]; if(ignData == NULL){ perror("Failed to open file"); return 1; } // 为每个指针分配结构体内存 for(int i=0; i<amountOfLines; i++){ data[i] = malloc(sizeof(Element)); if(data[i] == NULL){ perror("Failed to allocate memory"); // 释放已分配的内存,避免泄漏 for(int j=0; j<i; j++){ free(data[j]); } fclose(ignData); return 1; } } parsingFile(ignData, data); // 使用完释放所有动态分配的内存 for(int i=0; i<amountOfLines; i++){ free(data[i]); } fclose(ignData); } void parsingFile(FILE * file, Element * data[amountOfLines]){ for(int i = 0; i < 1; i++){ char buffer[maxLineLength]; if(fgets(buffer, maxLineLength, file) == NULL){ break; } char * token = strtok(buffer, ","); if(token != NULL){ // 用->简化指针访问语法,等价于(*data[i]).title strncpy(data[i]->title, token, sizeof(data[i]->title)-1); data[i]->title[sizeof(data[i]->title)-1] = '\0'; printf("%s is the title\n", data[i]->title); } } }
关键注意点
- 必须检查文件是否打开成功,避免空指针操作
- 用
strncpy代替strcpy,防止token长度超过title缓冲区导致溢出 - 动态分配内存后记得释放,避免内存泄漏
- 检查
strtok返回的token是否为NULL,防止空指针拷贝
内容的提问来源于stack exchange,提问作者Patrick Farmer
相关产品推荐
相关产品推荐

