用C语言线程从命令行反转字符串——分段错误



我是新手。

我正试图使一个C程序,反转从命令行给出的字符串,并创建一个线程,这样做的每一个。当我运行它给我分割错误。

代码如下:

 #include <stdio.h>
#include <sys/types.h>
#include <pthread.h>
#include <stdlib.h>
#include <fcntl.h>
char* final[1000];
pthread_mutex_t *mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_t p[];
void *reverse(void* arg){
char* s[100];
char* temp;
int i;
strcpy(s,(char*)arg);
printf("S este %s",s);
for(i=0;i<=strlen(s)/2;i++){
    strcpy(temp,s[i]);
    strcpy(s[i],s[strlen(s)-i-1]);
    strcpy(s[strlen(s)-i-1],temp);
}
sleep(1);
pthread_mutex_lock(&mutex);
strcat(final,s);
printf("Intermediar %s",s);
pthread_mutex_unlock(&mutex);
return NULL;
} 

int main(int argc,char* argv[]) {
int i;
int n = argc;
strcpy(final,"");
for(i=1;i<n-2;i++){
    pthread_create(&p[i],NULL,reverse,argv[i]);
}
for(i=1;i<n-2;i++){
    pthread_join(p[i],NULL);
}
//printf("Sirul final este %s",final);
return 0;
 }

有谁知道一个可以帮助我学习线程的好网站吗?

谢谢!

char* final[1000];

是一个指针指向char的数组(包含1000个元素),您需要一个char数组:

char final[1000];

这个数组也有同样的问题:

char* s[100];

temp被声明为指针,但您使用它作为大小为1的数组

声明不带*的互斥锁,删除初始化并在main中添加:

pthread_mutex_init(&mutex, NULL);
你还应该在pthread_t
的数组定义中添加一个数字

您从未初始化temp,因此调用strcpy(temp, s[i]);会导致未定义行为。

你对s的处理也很混乱,arg(一个字符串)复制到s(一个字符串指针数组)使用的内存是无效的。仅仅因为你可以抛弃警告并不意味着你在做明智的事情。

最新更新