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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:35:34