变量值检验中的分段错误

时间:2015-09-27 15:15:19

标签: c

我不明白为什么会出现段错误:  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

1 个答案:

答案 0 :(得分:1)

这将超出buf的空终止字符,除非它之前找到空格字符。

while (((*buf) != ' '))

修改为此

while (*buf && *buf != ' ')

如果buf中没有空终止字符,或者如果有,但你想读取超过该字符,那么检查你是否超出了缓冲区的大小。 E.g。

while (j < size && *buf != ' ')

此外,lseek不是获取文件大小来分配内存的有效方法,因为您必须从文件的开头到结束并再次返回到开始才能够读。看看fstat