printf中的C分段错误 - dl-lookup.c

时间:2014-03-16 18:37:30

标签: c multithreading segmentation-fault

我在运行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文件是什么。

如果你们需要更多细节,请告诉我,我会提供所需的信息。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我回答了我的问题,因为我做对了。 问题只是我将变量seqLinha传递给pthread_join()参数的方式,如下所示:

pthread_join(thread[0], seqLinha);

实际上,它应该是这样的:

pthread_join(thread[0], &seqLinha);

因为我必须传递seqLinha的地址才能修改它的值,所以指向percorreLinha中数组初始化提供的内存空间。