2014-12-01 48 views
0

我有一些麻煩從stdin複製一個字符串到一個緩衝區,該字符串的大小爲12個字符HS1234-0.txt供以後使用,這裏是我的代碼:將聊天覆制到緩衝區時出錯

while(1) { 
    sem_wait(&escsem); 
    pthread_mutex_lock(&esctrin); 
    char filename[12]; 
    read(STDIN_FILENO,filename,12); //this is where I read from the stdin 
    lseek(STDIN_FILENO,13,SEEK_SET); 
    buffer[bufferpos]=filename; //this is where I try to copy 
    bufferpos=(bufferpos+1) % BUFFER_SIZE; 
    conta++; 
    pthread_mutex_unlock(&esctrin); 
    sem_post(&lesem); 
} 

這裏是我嘗試訪問它,但它口口聲聲說緩存[bufferpos]是空的,file_to_open也爲空

char* file_to_open; 
    while(1){ 
    sem_wait(&lesem); 
    pthread_mutex_lock(&lertrin); 
    file_to_open=buffer[bufferpos];//this is where i try to copy the string 
    printf("buffer %s file %s\n",buffer[bufferpos],file_to_open);//and here it return null on both 
    bufferpos=(bufferpos+1) % BUFFER_SIZE; 
    conta++; 
    pthread_mutex_unlock(&lertrin); 
    sem_post(&escsem); 
    } 

每個片段是由不同的線程和緩存使用宣佈爲

​​

希望你能以某種方式幫助我感謝球員提前

+1

char buffer [BUFFER_SIZE]; – DRC 2014-12-01 16:00:37

+0

'buffer [bufferpos] =文件名; //這是我試圖複製的地方'那不會複製任何東西。這只是設置'buffer [bufferpos]'等於'filename',這是一個指針。 – 2014-12-01 16:24:06

+0

我以爲他知道這一點,因爲緩衝區是一個'char *'類型的數組。 – Jite 2014-12-01 16:24:51

回答

1

如果你想使用buffer的字符指針數組,那麼問題是filename是一個局部變量只有特定環路內有效。您正在保存一個指向該局部變量的指針,但是當您嘗試訪問它時,它是無效的。您需要爲指針動態分配內存,使其具有static或使其成爲全局的,以便從該範圍外可訪問。

如果你想在「串」到緩衝區內保存相反,你需要strlcpy/strncpy串到你的緩衝區,而不是和改變buffer類型char buffer[SIZE]使其字符,而不是字符指針數組。

1
char* file_to_open; 
while(1) 
{ 
    // why use both a semaphore AND a mutex? 
    sem_wait(&lesem); 
    pthread_mutex_lock(&lertrin); 

    file_to_open=buffer[bufferpos]; 

    // per the input code, buffer[bufferpos] is a pointer to 
    // a non-null terminated array of characters (not a string due to no terminator) 
    // so this will keep outputting characters until a (random) '\0' 
    // char is encountered. this is undefined behaviour 
    printf("buffer %s file %s\n",buffer[bufferpos],file_to_open); 

    bufferpos=(bufferpos+1) % BUFFER_SIZE; 
    conta++; 
    pthread_mutex_unlock(&lertrin); 
    sem_post(&escsem); 
} 
相關問題