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

C语言结构体中动态数组的访问与修改问题求助

C语言动态内存结构体数组修改问题解决

核心问题分析与修正

你的代码存在两个关键错误,还有一个潜在的内存风险:

  1. 语法错误
    你写的book_A->array[3]->date是错误的。book_A->array是DataState*类型,array[3]是数组的第4个元素(C语言数组下标从0开始),它是一个DataState结构体实例而非指针,访问成员必须用.操作符,正确写法是:

    book_A->array[3].date = auxiliary;
    
  2. 野指针风险
    auxiliary指向的是局部变量a的地址,makeBook函数执行完毕后,局部变量a会被销毁,该地址将变为无效内存,后续访问date会触发未定义行为。解决办法是动态分配内存存储数据:

    int* auxiliary = malloc(sizeof(int));
    *auxiliary = 5;
    book_A->array[3].date = auxiliary;
    
  3. 数组越界检查
    如果调用makeBook时传入的number小于等于3,array[3]会发生越界访问,这是非常危险的。建议在函数开头添加判断:

    if (number <= 3) {
        printf("错误:number必须大于3\n");
        return NULL;
    }
    

修正后的完整代码

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

typedef struct {
    char string[64];
    void* date;
    void* colour;
} DataState;

typedef struct {
    int number;
    DataState* array;
} Book;

Book* makeBook (int number){
    // 检查number是否足够,避免越界
    if (number <= 3) {
        printf("错误:number必须大于3\n");
        return NULL;
    }

    // 分配Book结构体内存,检查是否成功
    Book* book_A = malloc(sizeof(Book));
    if (!book_A) {
        perror("分配Book内存失败");
        return NULL;
    }
    book_A->number = number;

    // 分配DataState数组内存,检查是否成功
    book_A->array = malloc(number * sizeof(DataState));
    if (!book_A->array) {
        perror("分配DataState数组内存失败");
        free(book_A); // 释放已分配的Book内存
        return NULL;
    }

    // 动态分配内存存储整数5,避免野指针
    int* auxiliary = malloc(sizeof(int));
    if (!auxiliary) {
        perror("分配auxiliary内存失败");
        free(book_A->array);
        free(book_A);
        return NULL;
    }
    *auxiliary = 5;

    // 正确修改数组元素的成员
    book_A->array[3].date = auxiliary;

    return book_A;
}

// 记得写释放内存的函数,防止内存泄漏
void freeBook(Book* book) {
    if (!book) return;
    // 释放每个DataState里动态分配的date和colour
    for (int i = 0; i < book->number; i++) {
        free(book->array[i].date);
        free(book->array[i].colour);
    }
    free(book->array);
    free(book);
}

内容的提问来源于stack exchange,提问作者Juan598

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:45:37