`(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 ];
};