我有以下代码段segfaults,我完全不知道为什么。任何帮助将非常感谢。
当我这样做时会发生段错误(检查是否所有内容都已正确初始化)。没有打印任何内容,因此它在第一行上出现了段错误。不幸的是我不能使用valgrind,因为这个代码位于我无法访问的沙箱中,因此无法检查那里的问题。
for (i = 0 ; i<nb_read ; i++) {
fprintf(stdout, "Read Lock i %d %p \n ",i, nap->read_buffer[i]->sem_handle);
fprintf(stdout, "Write Lock i %d %p \n ",i, nap->write_buffer[i]->sem_handle);
fprintf(stdout, "Read Buffer i %d %p \n ",i, nap->read_buffer[i]->buffer);
fprintf(stdout, "Write Buffer i %d %p \n ",i, nap->write_buffer[i]->buffer);
}
其中SharedStruct是一个带有char *缓冲区成员和int sem_handle
的结构SharedStruct** create_buffer(int nb, int size) {
SharedStruct** result = malloc(nb * sizeof(SharedStruct*));
int i = 0 ;
for (i = 0 ; i<nb ; i++) {
SharedStruct* res= malloc(nb *sizeof(SharedStruct));
res->buffer = malloc(size * sizeof(char));
int lock = initialise_protection();
fprintf(stdout, "\n Semaphore initialised to %d \n ", lock);
res->sem_handle = lock ;
}
return result ;
}
答案 0 :(得分:6)
我没有看到你初始化结果中包含的指针。你只是为他们分配了空间,似乎你忘了在你的循环中做结果[i] = res。
答案 1 :(得分:1)
首先。您应该正确缩进代码,否则您将无法阅读自己的代码。
接下来,您将result
初始化为nb
条目数组,而不是初始化它。
接下来,你将nb
次指针分配给(SharedStruct *),并为每个这样的结构分配一个你没有保留的缓冲区,因此你不能在以后释放它。