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