程序执行过程中的分段错误

时间:2013-03-21 12:37:07

标签: c linux gcc pthreads

我编写了一个程序来创建10个线程并正常运行它们。该程序运行正常,但最后它给出了分段错误。这是什么错,造成它的原因是什么,我该如何解决? 我的代码是:

#include<stdio.h>
#include<pthread.h>
void *print(void *num);

int main()
{
    pthread_t tid[10];
    int n,check;
    void *exitstatus;
    for(n=1;n<=10;n++)
    {
        check=pthread_create(&tid[n],NULL,print,(void *)&n);
        if(check=0)
            printf("thread created");
        pthread_join(tid[n],&exitstatus);
    }

    return 0;

} 

void *print(void *num)
{
    int i,*val=(int *)num;
    for(i=0;i<(5);i++)
        printf("Hello World!!!(thread %d )\n",*val);
}

2 个答案:

答案 0 :(得分:7)

你有很多缺陷:

for(n=1;n<=10;n++) // No, The array starts from 0 and lasts on 9

试试这个

for(n=0;n<10;n++)

if(check=0) // No, this will assign 0 to check instead of compare it

试试这个

if(check==0)

答案 1 :(得分:3)

您正在访问索引之外的数组。这是未定义的行为。

您的数组t[10]从索引t[0]开始,应该以{{1​​}}结尾 -

t[9]

同样for(n = 0; n < 10; n++) { //your stuff } 是你检查平等的方法。 check == 0会将check = 0分配给0

所以你的代码必须如下所示:

check

关于编程风格的另一个重要注意事项:请使用适当的缩进并明智地使用空格。如果使用适当的缩进和空格,则可以消除大多数编程错误和错误。例如,在#include<stdio.h> #include<pthread.h> void *print(void *num); int main() { pthread_t tid[10]; int n,check; void *exitstatus; for(n = 0; n < 10; n++) { check=pthread_create(&tid[n], NULL, print, (void *)&n); if(check == 0) printf("thread created"); pthread_join(tid[n], &exitstatus); } return 0; } void *print(void *num) { int i,*val=(int *)num; for(i = 0; i < 5; i++) printf("Hello World!!!(thread %d )\n", *val); } 循环中的运算符之前和之后的一个空格,以及在for之后和下一个参数之前调用函数时的参数之间。