【问题标题】:Error in C: array type has incomplete element typeC 中的错误:数组类型的元素类型不完整
【发布时间】:2013-01-19 22:05:48
【问题描述】:

我正在做一个修改部分Android OS的项目,当我尝试实现一个新的系统调用来返回所有进程的状态时,我遇到了以下错误:

kernel/sys.c: error: array tpye has incomplete element type. 

我在 sys.c 中所做的如下:

/***previous code in sys.c***/

SYSCALL_DEFINE2(new_syscall, struct info __user*, buf, int __user*, nr){
    if(!buf || !nr) return -EINVAL;

    int nr_copy;
    int success;

    success = copy_from_user(&nr_copy, nr, sizeof(int));
    if(success == 0) return -EINVAL;
    if(nr_copy < 1) return -EINVAL;

    struct info buf_copy[nr_copy];  /*************

    return 0;
}

编译器抱怨标有星号的行。

我的 info.h 文件如下所示:

    #ifndef __LINUX_INFO_H
    #define __LINUX_INFO_H

    struct info {
        long state;         
        pid_t pid;          
        pid_t parent_pid;       
    };

    #endif

我尝试在 sys.c 中包含 info.h,但它根本没有帮助。谁能给我一些关于我应该研究什么的方向?

谢谢

【问题讨论】:

标签: android c operating-system kernel


【解决方案1】:

你用的是什么编译器?动态大小的数组是新的 C 功能,可能不受支持。 OTOH,它们是在堆栈上分配的,这是内核中非常稀缺的商品。您应该通过kmalloc 或其同类之一为数组分配内存。

【讨论】:

  • 它不是动态分配的数组,它是一个长度为 nr_copy 的固定大小的数组。 kmalloc 的好点
  • @user1926344,你得到的数组的大小在它的定义上面的那行,除非我的内核-C现在离我很远......
  • nr_copy 是声明为 int 的变量,因此 buf_copy[nr_copy] 在编译时不是固定大小的数组。
  • 哦,我现在看到了问题所在。谢谢!
【解决方案2】:

您是否尝试过将 state 显式声明为 long int。

long state; 

long int state;

【讨论】:

  • 有两个 __user* 指针。 info __user* 和 int __user*
  • long statelong int state 在 C 中的含义完全相同。
  • @vonbrand,用代码检查这个假设。取决于硬件和操作系统:286 上的 sizeof(int) 返回 2 16 位操作系统上的 sizeof(int) 386 上返回 2,但 32 位操作系统上返回 4。我的 x86_64 上的 sizeof(int) 返回 4,但 sizeof(long int) 返回 8。
  • 完全不相关。正如我所说,在 C 中 longlong int 完全相同,如果省略类型,则默认为 int(是的,这来自 C 的史前史)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 2018-10-24
  • 1970-01-01
  • 2017-05-21
  • 2021-02-09
  • 2013-09-27
相关资源
最近更新 更多