C: 控制到达非 void 函数的末尾...即使它 returns int?

C: control reaches end of non void function... Even though it returns int?

我正在用 C 编写一个字符设备(针对 linux)。我有这个功能:

static ssize_t
device_write(struct file *file,
     const char __user * buffer, size_t length, loff_t * offset)
{
    int i, fd = 0;
    int = bytes_written;

    fd = open(file, O_WRONLY);

    printk("device_write(%p,%d)\n", file, length);

    for (i = 0; i < length && i < BUF_LEN-1; i++)
        get_user(Message[i], buffer + i);

    bytes_written = write(fd,Message,i);
    Message[BUF_LEN-1] = '[=11=]';
    /* return the number of input characters used */
    return bytes_written;
}

编译时出现错误:控件到达非空函数的末尾。我已经仔细检查过我正在编译正确的程序,这让我抓狂。

欢迎任何帮助。

此外,稍微无关,但是否可以将 char 缓冲区初始化为某个字符串(例如 char buffer[1000] = "HELLO")?

int = bytes_written; 至少应该 int bytes_written; 才能修复您当前的错误。可能还有其他人。

功能问题较多

  1. 这是无效的

    int = bytes_written;
    

    也许你的意思是

    int bytes_written;
    
  2. 您必须检查 fd != -1open() 之后的任何代码都将“可能”导致 无效文件descriptor 错误,因为您无法保证 fd 是有效的描述符。

    而且你甚至不知道是否设置了错误,因为

    1. 你没有检查write()是否成功。
    2. 在每次可能设置它的值 != 0 的调用后,您不检查 errno 的值是什么,即 open()write()
  3. 这个Message[BUF_LEN-1] = '[=21=]';很可能是错的,应该是Message[i - 1] = '[=22=]'

    这似乎合乎逻辑

    memcpy(Message, buffer, length); 
    Message[length] = '[=12=]';
    
  4. 正如@ 所评论的,您不能使用内核 space.

    [ 中的 open()write()