2013-03-18 71 views
0

我有麻煩理解我在網上找到這個例子代碼。能否請你幫我在理解這個有人能解釋一下這段代碼片段在做什麼嗎?

#define PKTNAME  "Msg" 
FILE *data;  
char outMsg[1500]="getmybw\0"; 

data = fopen(PKTNAME,"r"); 
printf("file open success!!\n"); 
if(fgets(outMsg, 1024, data)) 
    printf("Msg read success!\n"); 
outMsgLen = strlen(outMsg)+1; 
printf("outMsgLen is: %d,\toutMsg is:\n%s\n",outMsgLen,outMsg); 

此外,當我運行此代碼,我在這條線得到一個分段錯誤:

if(fgets(outMsg, 1024, data))

+0

什麼是'PKTNAME'? – 2013-03-18 06:54:18

+0

另外,在你的'fopen'後面加上代碼:'if(data!= NULL)'。這將確保您的代碼在文件未找到時不會繼續。 – 2013-03-18 07:01:21

+0

'#define PKTNAME「Msg」' 不打開使用名稱PKTNAME創建文件? 如果fopen只打開名稱爲「PKTNAME」的文件,該文件必須位於何處? – sukhvir 2013-03-18 07:03:14

回答

1

肯定。

首先,代碼段泄漏存儲器通過分配指針malloc() ated,1025字節長的緩衝器向data指針,然後將其重新分配的fopen()返回值。

其次,代碼錯誤地假定fopen()總是成功,打印誤導信息消息給用戶,然後嘗試讀取一行或至多1023個字節到緩衝器outMsg

第三,如果調用fgets()成功,它會打印「成功」消息。

在步驟4,它抓住長度與數據剛讀,錯誤地將其分配給類型的變量int(它應該是size_t代替),然後使用printf()顯示長度和消息到控制檯。


簡而言之,無論誰給你提供這段「示例代碼」,都應永久禁止編程。

+0

對不起,我只是編輯我原來的帖子..我嘗試修復代碼一點我自己..我得到擺脫malloc和我仍然得到分段錯誤 我仍然是編程的菜鳥,所以,請你給我方法來解決這個 – sukhvir 2013-03-18 06:14:36

+1

@sukhvir否,除非你使用調試器。 – 2013-03-18 06:16:07

+0

我確實使用了調試器..這是調試錯誤: 編程接收到的信號EXC_BAD_ACCESS,無法訪問內存。 原因:地址中的KER_INVALID_ADDRESS:0x0000000000000068 0x00007fff9126e3a5 fgets() – sukhvir 2013-03-18 06:30:56

相關問題