我在运行C多线程代码时遇到了段错误。 显然它运行正常,直到我尝试从2D char数组中打印一个元素。
我试图寻找答案,但似乎没有解决问题。
这是我遇到段错误的代码的一部分:
k = 0;
for(i = 0; i < TAB_ALT; i++){
for(j = 0; j < TAB_LARG; j++){
if(tab[i][j] == 'X'){
printf("(");
for(l = 1; l <= possibilidades[k][0]; l++){
printf("%c", possibilidades[k][l]);
}
printf(") ");
k++;
} else {
printf("%c ", tab[i][j]); //Seg fault here
}
} // Fim for
printf("\n");
} //Fim for
编辑:使用Valgrind
搜索内存泄漏后,如Barmar
所示,我发现用于获取线程函数返回的变量不是实际上得到它。它应该是一个char数组(seqLinha)。在线程函数中,它填充得很好,但是应该得到它的内存地址的变量不是。
我认为这可能与我在pthread_join()中将其作为参数传递的方式有关。
typedef struct argPercorre {
int i;
char (*tab)[9];
} ArgPercorre;
void *percorre_linha(void *arg){
ArgPercorre argumento;
argumento = *(ArgPercorre *)arg;
int k = argumento.i;
int l;
char *seqLinha = (char *) malloc(9*sizeof(char));
char (*tab)[9] = argumento.tab;
for(l = 0; l < TAB_LARG; l++){
seqLinha[l] = tab[k][l];
}
return seqLinha;
}
char *seqLinha;
pthread_create(&(thread[0]), NULL, percorre_linha, (void *)argLinha);
pthread_join(thread[0], (void*)seqLinha);
之前的代码似乎工作正常,我想。这些变量之前已声明并初始化。如果需要,我可以在此之前放置代码,也许那里有问题。
GDB错误消息是:
Program received signal SIGSEGV, Segmentation fault.
do_lookup_x (new_hash=359345080, old_hash=<optimized out>,
result=0x7fffffffdbe0, scope=<optimized out>, i=0, flags=5, skip=0x0,
undef_map=0x7ffff7ffe2c8) at dl-lookup.c:98
98 dl-lookup.c: No such file or directory.
我不知道这个dl-lookup.c文件是什么。
如果你们需要更多细节,请告诉我,我会提供所需的信息。
提前致谢。
答案 0 :(得分:0)
我回答了我的问题,因为我做对了。
问题只是我将变量seqLinha
传递给pthread_join()参数的方式,如下所示:
pthread_join(thread[0], seqLinha);
实际上,它应该是这样的:
pthread_join(thread[0], &seqLinha);
因为我必须传递seqLinha
的地址才能修改它的值,所以指向percorreLinha
中数组初始化提供的内存空间。