有人能解释一下这段代码片段在做什么吗?

问题描述:

我有麻烦理解我在网上找到这个例子代码。能否请你帮我在理解这个有人能解释一下这段代码片段在做什么吗?

#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

肯定。

首先,代码段泄漏存储器通过分配指针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