Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
`(void*)`用法用作函数参数,而不是'struct'*`_C - Fatal编程技术网

`(void*)`用法用作函数参数,而不是'struct'*`

`(void*)`用法用作函数参数,而不是'struct'*`,c,C,如果我使用这样的东西,会有很大的区别吗: void print_struct( void *ptr_to_struct ) 而不是: void print_struct( struct data *ptr_to_struct ) 我问这个问题是因为我陷入了一些我无法理解的事情中,为什么它不能以以下方式工作: #include <stdio.h> #include <string.h> #include <stdlib.h> void print_stru

如果我使用这样的东西,会有很大的区别吗:

void print_struct( void *ptr_to_struct )
而不是:

void print_struct( struct data *ptr_to_struct )
我问这个问题是因为我陷入了一些我无法理解的事情中,为什么它不能以以下方式工作:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void print_struct( struct data *ptr_to_struct );
struct data{
    char name[ 256 ];
};

int main( void )
{
    struct data ptr;
    strcpy ( ptr.name, "George" );
    print_struct_1( &ptr);
}

void print_struct( struct data *ptr_to_struct )
{
    struct data *ptr = ptr_to_struct;
    printf("Name = %s\n", ptr->name );
}
但如果我提出动议:

void print_struct( struct data *ptr_to_struct );
之后:

struct data{
    char name[ 256 ];
};
汇编得很好

我不明白的是:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void print_struct( void *ptr_to_struct );
struct data{
    char name[ 256 ];
};
//void print_struct( void *ptr_to_struct );


int main( void )
{
    struct data ptr;
    strcpy ( ptr.name, "George" );
    print_struct_1( &ptr);
}

void print_struct( void *ptr_to_struct )
{
    struct data *ptr = ( struct data * )ptr_to_struct;
    printf("Name = %s\n", ptr->name );
}
在以下时间之前或之后:

struct data{
    char name[ 256 ];
};
程序运行良好

为什么会有这种差异

  • 当您在函数原型中引用未知的结构类型时,它实际上声明了一个新的结构类型。然而,新的类型将是当地的原型。新类型将不会与之后声明的任何相同名称
    struct something
    类型相关。比如说

    void foo(struct S *p) {}
    struct S { int i; };
    
    int main(void) {
      struct S s;
      foo(&s); // ERROR: the pointer types are unrelated
    }  
    
    基本上,不要这样做。不要在函数原型中使用未知的
    struct something
    类型。这是毫无意义的。它实际上总是一个打字错误或其他错误的指示。这就是编译器发出警告的原因

    这些结构类型必须在原型之前声明。您可以重新排列您的声明(正如您已经尝试的那样)。也可以预先声明结构类型

    struct data;
    void print_struct( struct data *ptr_to_struct );
    struct data{
      char name[ 256 ];
    };
    
    这也将正常工作

  • 使用参数类型
    void*
    声明函数原型,然后使用参数类型
    struct something*
    定义相同的函数,即使程序看起来“工作正常”,也会导致未定义的行为


  • 所以如果我使用它,或者可以导致
    UB
    ?@Michael B:你在链接上看到的看起来很好。一些常量限定符是完全不合理的。
    一些常量限定符是完全不合理的
    为什么?我的意思是,它的目的是告诉编译器,我没有碰那个指针或它的指向值。或者我错了?@Michael B:那么,在这种情况下,保持一致:在你的
    print_-struct
    中声明
    ptr
    const-struct-data*ptr
    。这也会使演员阵容变得不必要。目前,您使用该强制转换来强制转换一些
    常量。如果你打算马上扔掉它,那么使用
    const
    有什么意义呢?我现在明白了。非常感谢。
    void foo(struct S *p) {}
    struct S { int i; };
    
    int main(void) {
      struct S s;
      foo(&s); // ERROR: the pointer types are unrelated
    }  
    
    struct data;
    void print_struct( struct data *ptr_to_struct );
    struct data{
      char name[ 256 ];
    };