【问题标题】:Could someone please explain what this code snippet is doing?有人可以解释一下这段代码在做什么吗?
【发布时间】:2013-03-18 17:54:54
【问题描述】:

我无法理解我在网上找到的这个示例代码。你能帮我理解一下吗

#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))

【问题讨论】:

  • 另外,在您的fopen 后面附上代码:if(data != NULL)。这将确保您的代码在找不到文件时不会继续运行。
  • #define PKTNAME "Msg" 不会创建一个名为 PKTNAME 的文件?如果 fopen 只打开名为“PKTNAME”的文件..这个文件必须在哪里?
  • 好的,我添加了 if 语句用于错误检查,就像你建议的那样。这正是问题发生的地方。 fopen 不工作。是什么导致了这个问题?
  • 不。 fopen 如果您指定“r”作为模式,则如果文件不存在,则将返回 NULL。请阅读the documentation 以获得更好的清晰度。如果您的程序在发布此 sn-p 之前未修改当前目录,则“MSG”文件必须与可执行文件位于同一目录中。
  • 感谢 100% 的工作......我将模式更改为“w+”来创建和更新文件......非常感谢

标签: c macos segmentation-fault


【解决方案1】:

当然。

首先,代码 sn-p 泄漏内存,方法是将指向 malloc()ated 的 1025 字节长缓冲区的指针分配给 data 指针,即然后重新分配fopen()的返回值。

其次,代码错误地假定fopen()总是成功,向用户打印误导性信息消息,然后尝试读取一行或最多1023个字节到缓冲区outMsg

第三,如果对fgets()的调用成功,它会打印“成功”消息。

第四步,它获取刚刚读取的数据的长度,错误地将其分配给int类型的变量(应该是size_t ),然后使用printf()向控制台显示长度和消息。


简而言之,向你提供这段“示例代码”的人应该被永久禁止编程。

【讨论】:

  • 对不起,我刚刚编辑了我的原始帖子..我尝试自己修复代码..我摆脱了 malloc,但我仍然遇到分段错误我仍然是编程的菜鸟,你能请给我解决这个问题的方法
  • @sukhvir 不,除非你使用了调试器。
  • 我确实使用了调试器..这是调试错误:程序收到信号 EXC_BAD_ACCESS,无法访问内存。原因:KER_INVALID_ADDRESS 在地址:0x0000000000000068 0x00007fff9126e3a5 in fgets()
  • @sukhvir Stacktrace 等?
猜你喜欢
  • 2018-04-26
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多