2012-12-13 67 views
0

以下是我從pipe函數中讀取的代碼片段。這會正確執行並驗證數據是否進入緩衝區。GCC 4.7.0運行時間問題 - 接收信號11(SigSegv)

int readFrom(char *buffer) 
{ 
int nread; 

if((nread = read(readfd,buffer,100)) < 0) 
{ 
    printf("\nerror in reading data from FIFO\n"); 
    return(-1); 
} 
buffer[nread]='\0'; 
return(0); 
} 

在上面的例子中,nread小於100。我正在使用GCC-4.7.0。

我們有用於上述功能類似下面的抽象層:

int pipe_input(char *parmPtr, int size) 
{ 

char readMsg[100]; 


if(readFrom((char *)&readMsg) == -1) 
    return ERROR; 

if (strlen(readMsg) < 1) 
{ 
    printf("Incorrect Input\n"); 
    return ERROR; 
} 
strncpy(parmPtr, readMsg, ((size < 100)?size:100)); 


return 0; 

}

在上面的函數,以及可以確認讀取的消息是正確的,並parmptr被正確地裝載用值。但在函數中,我試圖調用pipe_input我得到一個sigsegv。這發生在GCC-4.7.0中,但是使用GCC-4.2.4編譯的相同代碼執行得很好。我覈實了警告,但沒有警告以上。任何指針都會非常有幫助。

下面的代碼片段調用pipe_input:

int Calling_func(void) 
{ 
    char alpha[100] ; 

    pipe_input(alpha,100); 
    printf("alpha value is %s \r\n",alpha); 
} 

在print語句獲取SIGSEGV。

+0

什麼是'密碼'?這是一個錯字還是'alpha'沒有初始化?將未初始化的char數組傳遞給printf是有問題的。 –

+0

這是一個錯字;它需要是阿爾法。 – lxusr

+0

顯示「Calling_func()」的代碼段確實不會實際調用您的'pipe_input()'函數(也不會調用''readFrom()')。 –

回答

2

您的代碼中存在錯誤的錯誤。你的陣列有100個元素,但你不採取空終止考慮:

strncpy(parmPtr, readMsg, ((size < 100)?size:100)); 

和:

buffer[nread]='\0'; 

的最後一個元素是buffer[99](因爲數組下標爲0,而不是1開始, ),但你可以寫信給buffer[100]。這可能會導致段錯誤。

你應該聲明大小爲101的所有數組,然後看看它是否有幫助。如果你在Linux上,你也應該在Valgrind中運行你的程序;它可以確切地告訴你segfault是如何發生的。

相關問題