1

我正在学习 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);
}
4

2 回答 2

3

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

scanf("%s",&string1);

scanf("%s",string1);

让它现在工作。

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

POSIX 线程编程

解释:

string1 是一个变量,存储在内存中。所以它有一个内存地址说a1(这是起始地址)。现在这个内存地址中存储了什么?这来自您在下面的赋值语句。

string1 = malloc(1000);

malloc -> 分配一块 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.

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

希望这个解释有所帮助。一般来说,PL。参考下面的c-faq链接,对理解c概念很有帮助 comp.lang.c常见问题

于 2012-08-15T12:08:34.650 回答
1

线程通常会导致缓冲流的古怪行为,但您的代码也是错误的。getName有一个错误的签名,pthread_createscanf用冲突的参数(即“%s”和char**)调用它。

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

于 2012-08-15T12:06:36.080 回答