C中的线程/功能指针错误

时间:2012-08-15 12:04:13

标签: c pthreads

我正在学习C中的函数指针和线程。以下代码将创建一个将从用户读取字符串的线程。然后它将打印用户在主线程上输入的名称。但是我得到了分段错误:11

#include<pthread.h>
#include<stdio.h>

int agelimit;
char *string1, *string2;
void *getName();
//void (*getAge)();
main(){

    pthread_t thread1,thread2;

    string1 = malloc(1000);
    //scanf("%s",string0);
    pthread_create(&thread1, 0, getName, 0);


    //pthread_create(&thread2, 0, getAge, 0);
    sleep(10);
    printf("name is %s age is",string1);



}
void *getName(){

    int x;
    printf("enter name:");

    scanf("%s",&string1);
}

2 个答案:

答案 0 :(得分:3)

虽然您的代码需要更多改进/错误处理,但似乎您需要更改

scanf("%s",&string1);

scanf("%s",string1);

让它现在正常运作。

PL。请参阅链接以获取有关

的优秀教程

POSIX Threads Programming

<强>解释

string1是一个变量并存储在内存中。所以它有一个内存地址说 a1 (这是起始地址)。 现在存储在这个内存地址中的是什么?这来自您下面的作业声明。

string1 = malloc(1000);

malloc - &gt;分配一块1000字节的内存并返回块的起始地址,即 p1

所以现在变量string1的内容是 p1 ,换句话说,内存单元 a1 现在有 p1 (实际上这不应该是单个单元格,但是4字节/ 8字节数量。但是为了简单起见,我假设单个单元格。)

现在scanf期望什么作为它的第二个参数?

scanf("%s",&string1);

A valid address where it can store the input which it has accepted.

What is that in this example a1 or p1? - It is p1.

因此,当您将&amp; string1作为scanf的参数时,您将 a1 传递给scanf,这是不正确的。它应该 p1 才能正常工作,所以你需要传递string1而不是&amp; string1

希望这个解释有所帮助。一般来说Pl。请参阅下面的c-faq链接,这对于理解c概念非常有用 comp.lang.c Frequently Asked Questions

答案 1 :(得分:1)

一般情况下,线程可能导致缓冲流的奇怪行为,但您的代码也是错误的。 getName pthread_create的签名错误,在其内部,您正在使用有争议的参数(即“%s”和scanf)调用char**

考虑在您正在使用的任何编译器中将警告级别提高。