嵌套结构体实例编辑异常:EXC_BAD_ACCESS错误排查求助
解决你的嵌套结构体内存访问崩溃问题
嘿,你遇到的Thread 1: EXC_BAD_ACCESS是典型的野指针访问问题——核心原因就是你声明了SharedData *shmem;这个指针,但从来没给它分配有效的内存,直接去访问shmem->pid_queue当然会崩。
问题出在哪?
看你这段代码:
int numberOfProcess = 5; shmem->pid_queue = createQueue(numberOfProcess); // 这里shmem是个野指针! enqueue(shmem->pid_queue, getpid());
SharedData *shmem;只是定义了一个指针变量,它默认指向的是一块随机的、无效的内存地址(也就是野指针)。当你尝试给shmem->pid_queue赋值时,相当于往一块不属于你的内存里写数据,系统直接触发内存保护把程序停了。
怎么修复?
根据你用SharedData的场景,分两种情况处理:
1. 只是单进程内使用(非共享内存)
如果这个结构体只在当前进程里用,先给shmem分配堆内存:
// 先给SharedData本身分配内存 SharedData *shmem = (SharedData*)malloc(sizeof(SharedData)); if (shmem == NULL) { perror("malloc failed for SharedData"); exit(EXIT_FAILURE); } // 再初始化队列 int numberOfProcess = 5; shmem->pid_queue = createQueue(numberOfProcess); // 别忘了检查createQueue的返回值,避免空指针 if (shmem->pid_queue == NULL) { perror("createQueue failed"); free(shmem); exit(EXIT_FAILURE); } enqueue(shmem->pid_queue, getpid());
2. 跨进程共享内存场景
如果SharedData是要放在共享内存里给多个进程用,你得用共享内存API(比如System V的shmget/shmat,或者POSIX的shm_open)先拿到有效的共享内存地址:
// 示例用System V共享内存 key_t key = ftok("/tmp", 'R'); // 生成唯一的共享内存键 int shmid = shmget(key, sizeof(SharedData), IPC_CREAT | 0666); if (shmid == -1) { perror("shmget failed"); exit(EXIT_FAILURE); } // 把共享内存关联到当前进程的地址空间 SharedData *shmem = (SharedData*)shmat(shmid, NULL, 0); if (shmem == (SharedData*)-1) { perror("shmat failed"); exit(EXIT_FAILURE); } // 之后再初始化队列 int numberOfProcess = 5; shmem->pid_queue = createQueue(numberOfProcess); enqueue(shmem->pid_queue, getpid());
⚠️ 这里要注意:createQueue里用malloc分配的队列内存是属于当前进程的,其他进程访问不到。如果要让队列也能跨进程共享,你得把Queue的array也分配到共享内存里,不能用普通malloc。
额外的健壮性优化
给createQueue加个错误检查,避免分配失败返回空指针:
Queue* createQueue(unsigned capacity) { Queue* queue = (Queue*) malloc(sizeof(Queue)); if (queue == NULL) { perror("malloc for Queue struct failed"); return NULL; } queue->capacity = capacity; queue->front = queue->size = 0; queue->rear = capacity - 1; queue->array = (int*) malloc(queue->capacity * sizeof(int)); if (queue->array == NULL) { perror("malloc for Queue array failed"); free(queue); // 已经分配的结构体内存要释放,避免内存泄漏 return NULL; } return queue; }
内容的提问来源于stack exchange,提问作者omer muhit
相关产品推荐
相关产品推荐

