C-不正确的方法需要纠正

时间:2015-08-28 08:05:37

标签: c pointers memory

我有一个问题,如果我复制我的作业可能看起来像,但这不是我的功课。它是大学考试的一部分,我想在家里解决它(以及其他人),以便我为下一次考试做好准备。 我的目标是我理解,以便我可以自己解决类似的问题。我熟悉高级语言,但C是我的弱点之一,这就是我在这里遇到问题的原因。

问题

考虑以下方法:

int safe_read(int fd, char *buff, size_t len){
    do {
        errno = 0;
        pos += read(fd, buff + pos, len);
        if (-1 == len) {
            if (ENTER != errno) {
                return 0;
            }
        }
    } while(ENTER == errno);
    return pos;
}

以及以下电话:

pos = safe_read(STDIN_FILENO, msg, 225);

分析代码并回答以下问题:

1)safe-read是否会返回在所有情况下正确读取的字节数?

2)如果没有,怎么解决?

好。目前,我已经理解了以下内容:

1) 不,它没有,原因如下:

- 调用者可能将fd设置为无效的内容。  -pos未正确初始化。   - 变量ENTER也未初始化。  -if(-1 == len)没有意义,因为len是调用者设置的参数,因此在一次调用时总是为真或假。

-it也不安全,因为它可能超出缓冲区的最大大小(通过将len设置为值> = sizeof(buff))

-it不返回在所有情况下读取的字符数,如f.e.当我第一次读len字符时,第二次它失败了。即使len字符已被读取,我也会返回零。

2)这是我的修复。 初始化变量

/ * 为了更好地理解,我写下了我对这个方法应该做什么的理解:

- 将字符读入char * buff。 - 返回读取为int的字符数 -fd是要读取的文件的文件描述符 -len是要读取的字节数

* /

int safe_read(int fd, char *buff, size_t len){
    int ENTER=0;
    int pos=0;
    do {
        errno = 0;
        pos += read(fd, buff + pos, len);
        if (len < 0) {
            if (ENTER != errno) {
                return 0;
            }
        }
    } while(ENTER == errno);
    return pos;
}

我理解正确吗?我的修正是否正确?

谢谢!

特别感谢Paul Ogilvie在我编辑之前的帮助!

1 个答案:

答案 0 :(得分:1)

您的代码包含许多错误,其他成员想知道这是否是作业。但我会尽力帮助你。首先是你的代码:

int safe_read(int fd, char *buff, size_t len)
{
  int pos= 0;
  do{
    errno=0;
    pos+=read(fd, buff+pos, len);
    if(-1==len){
      if(ENTER!=errno){
        return 0;
      }
    }
  }while(ENTER==errno);
  return pos;
}

变量pos未定义,即使它是全局定义的,您可能需要将其初始化为零。

然后你的搞笑变量ENTER,既没有定义,更重要的是,从未在你的代码中设置。所以它不会改变价值。你对这个变量的意图是什么?

然后if(-1==len)len是一个不会改变的参数,因此它不是-1或者它永远不会。显然,您想要检查读取时的错误,但这不是方法。

那么这是否安全:不,不是。假设len的大小为buff,那么您会反复将len个字符附加到buff,因此在第二次读取时,它将超出缓冲区的大小。

最后,这个函数是否总会返回正确的字符数:不,不是。假设您第一次读取len个字符,第二次读取时失败。然后返回0,但已读取len个字符。