我不明白为什么会出现段错误: while(((* buf)!='')) 我想在N个其他数组(N个线程)中存储一个数组的内容,但是当我存储buff的内容时,我不会剪切一个单词。 当我测试* buf ??
的值时,我不明白为什么会出现分段错误#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#define MAX_WORD_LENGHT 10
void *count_func(void *arg)
{
}
int main (int argc, char **argv){
pthread_t *tids;
char * buf, * save;
ssize_t cpt;
int i, j, fd, count, size, decoup;
if (argc <2 )
{
printf("\n usage : %s [nom_du_fichier] \n ", argv[0]);
exit(1);
}
fd = open(argv[1],O_RDONLY);
//taille du fichier
size = lseek (fd,0,SEEK_END);
printf("\ntaille du fichier : %d octets\n",size);
lseek(fd,0,SEEK_SET); // repositionement du pointeur au début du fichier.
count = sysconf(_SC_NPROCESSORS_ONLN);
count = (count < 1) ? 1 : count;
char *tabs[count];
buf =(char *)malloc(size);
while ((cpt=read(fd,buf, size)) > 0){
printf("lect en cours \n");
}
save=buf;
while((*buf)!= '\0'){
printf("carc: %c \n", *buf);
buf++;
}
// répartion des données de buf sur N sous tableau: N correspandant aux nbr
// de threads
for (i=0; i< count; i++){
tabs[i]= (char *) malloc ((size/count)+ MAX_WORD_LENGHT);
}
buf= save; // on sauvgarde l'adresse du début du tableau.
for (i=0; i<count; i++){
for (j=0; j<=(size/count); j++, (*buf)!= '\0'){
if (j != (size/count)){
printf("j:%d \t", j);tabs[i][j] = *buf;
buf++;
}else {
if (isspace(*buf)){
printf("cond 1\n");
break;
}else{
while (((*buf)!= ' ')){ tabs[i][j]= *buf; buf++; j++;}
printf("cont: %c \t ", *buf);
printf("cond 2\n");
break;
}
}
}
}
for (i=0; i< count; i++){
for (j=0; j< (size/count)+1; j++){
printf("value of tabs[%d][%d] is : %c \n", i, j, tabs[i][j]);
}
printf("tabs: %d done \n", i);
}
decoup = (size-1)/count;
tids = (pthread_t *)malloc (sizeof(pthread_t) * count);
if(tids == NULL)
{
printf("main: failed to allocate tids \n");
exit(-1);
}
close(fd);
buf=save;
free(buf);
// free(tabs[0]); free(tabs[1]);free(tabs[2]);free(tabs[3]);
// free(tids);
return 0;
}
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
答案 0 :(得分:1)
这将超出buf
的空终止字符,除非它之前找到空格字符。
while (((*buf) != ' '))
修改为此
while (*buf && *buf != ' ')
如果buf中没有空终止字符,或者如果有,但你想读取超过该字符,那么检查你是否超出了缓冲区的大小。 E.g。
while (j < size && *buf != ' ')
此外,lseek
不是获取文件大小来分配内存的有效方法,因为您必须从文件的开头到结束并再次返回到开始才能够读。看看fstat。