C 动态内存分段错误

Posted

技术标签:

【中文标题】C 动态内存分段错误【英文标题】:C Dynamic Memory Segmentation Fault 【发布时间】:2021-11-28 20:10:03 【问题描述】:

我正在为学校完成这项作业,我想知道为什么我不断收到针对有限状态机的动态内存分配的分段错误。我创建了相同的内存分配和空闲函数,但是即使我的 main 只一个接一个地包含它们,我仍然会收到分段错误。我想知道是否有人可以帮我一把?谢谢你:)

主要功能:

int main(int argc, char** argv) 
    
    if(argc < 2 || argc > 2 || atoi(argv[1]) > MAX_STATE_MACHINE_NO)
    
        printf("Error: Invalid input arguments\n");
        exit(1);
    

    int stateMachineNumber;

    stateMachineNumber = atoi(argv[1]);
    StateMachine** stateMachines = malloc(sizeof(StateMachine*) * stateMachineNumber);

    stateMachineAllocation(stateMachines, stateMachineNumber);
    //grabInputs(stateMachines, stateMachineNumber);
    freefunction(stateMachines, stateMachineNumber);


    return 1;

内存分配函数:

void stateMachineAllocation(StateMachine** stateMachines, int stateMachineNumber)


    for(int i = 0; i < stateMachineNumber; i++)
       
        stateMachines[i] = (StateMachine*)malloc(sizeof(StateMachine));
        stateMachines[i]-> states = malloc(sizeof(State)*MAX_STATE_NO);

        for(int j = 0; j < MAX_STATE_MACHINE_NO; j++)
        
            stateMachines[i]-> states[j] = (State*)malloc(sizeof(State));

            for(int w = 0; w < 4; w++)
            
                stateMachines[i]-> states[j]-> connectedStates[w] = (State*)malloc(sizeof(State));
            
        
    

空闲内存功能:

void freefunction(StateMachine** stateMachines, int stateMachineNumber)


     for(int i = 0; i < stateMachineNumber; i++)
    
        for(int j = 0; j < MAX_STATE_NO; j++)
        
            for(int w = 0; w < 4; w++)
            
                free(stateMachines[i]-> states[j]-> connectedStates[w]);
            

            free(stateMachines[i]-> states[j]);
        

        free(stateMachines[i] -> states);
        free(stateMachines[i]);
    

    free(stateMachines);

谢谢大家,我对 C 比较陌生,所以这将是一个很大的帮助。

【问题讨论】:

您正在分配MAX_STATE_NO 状态,但您正在索引states,索引范围从0 到MAX_STATE_MACHINE_NO-1。这不一致。 MAX_STATE_NOMAX_STATE_MACHINE_NO是什么关系?看来你应该在stateMachines[i]-&gt; states的分配中使用了后者 (忽略之前的评论)看看StateMachine的定义会有所帮助 您是否尝试过使用诸如 AddressSanitizer 之类的工具来给您提示?在gccclang 中,通常就像在编译和运行程序时添加-g -fsanitize=address,undefined 一样简单——你会得到很多有用的信息。 stateMachines[i]-&gt; states = malloc(sizeof(State)*MAX_STATE_NO);stateMachines[i]-&gt; states[j] = (State*)malloc(sizeof(State)); 中至少有一个是错误的,因为间接级别不同,但对象大小相同。你可以通过使用p = malloc(N * sizeof *p); 模式来避免这个问题 【参考方案1】:

看起来不对的一件事是:

StateMachine** stateMachines = malloc(sizeof(StateMachine*) * stateMachineNumber);

如果您打算拥有一个 stateMachines 块,您可能应该使用:

StateMachine* stateMachines = malloc(sizeof(StateMachine*) * stateMachineNumber);

这将返回多个状态机的内存地址,一个接一个地在内存中(实际上是一个状态机数组)。

您当前正在将此分配给编译器将其解释为指向第一个 stateMachine 的指针的指针,这可能不是您想要的。

【讨论】:

以上是关于C 动态内存分段错误的主要内容,如果未能解决你的问题,请参考以下文章

C语言:动态内存错误

FORTRAN 内存利用率 - 静态与动态

C语言之动态内存管理(动态内存分配+经典笔试题+柔性数组)[建议收藏]

梦开始的地方—— C语言动态内存管理(malloc+calloc+realloc+free)

玩转C语言动态内存,轻松管理动态内存空间

玩转C语言动态内存,轻松管理动态内存空间