The*_*ker 1 c c++ pointers structure
我想知道两者之间的区别
struct file_operations {
} a;
Run Code Online (Sandbox Code Playgroud)
和
struct file_operations {
} *a;
Run Code Online (Sandbox Code Playgroud)
就像在内存中如何分配它们一样?在第一种情况下,编译器如何知道“ a”的存储位置?来自符号表吗?如果是这样,如何找到符号表(或任何其他表)的地址?
在第二种情况下,我假设内存地址存储在大小为32位的变量中,那么如何确定该变量的位置(第二个代码中“ a”的地址)?
在第一种情况下,该结构的实例分配在内存中,分配的字节数等于所返回的值sizeof(a)。
在第二种情况下,分配了指针,分配的字节数等于指针的大小,即sizeof(void *)。
您可能会猜到,第二种情况不允许您访问结构的字段,因为指针指向的内存是无效的,直到您从堆中请求足够的内存,或者直到您使其指向实例为止就像第一个例子中的一样
假设我们具有以下结构
struct Data {
int quantity;
double value;
char name[100];
};
Run Code Online (Sandbox Code Playgroud)
如果您执行以下操作
struct Data data;
Run Code Online (Sandbox Code Playgroud)
然后struct Data分配了一个实例,您可以立即访问其字段,例如
data.quantity = 1;
data.value = 3.0;
strcpy(data.name, "My Name Is ...");
Run Code Online (Sandbox Code Playgroud)
如果声明一个指针,就像
struct Data *pointer;
Run Code Online (Sandbox Code Playgroud)
那么您将无法访问这些字段,除非您使指针指向的有效实例struct Data,否则将发生未定义的行为,您可以通过获取struct Data data;我们已经在上面初始化的的地址来创建此类实例,如下所示
pointer = &data;
Run Code Online (Sandbox Code Playgroud)
指针的生存期限制了指针的有效期,一旦您超出了data声明的范围,指针将指向垃圾,因为该指针将data被释放。
使指针有效的另一种方法是使用malloc(),即通过从系统堆中请求内存,即通过请求sizeof(struct Data)字节来完成 ,例如此处1
pointer = malloc(sizeof(struct Data));
Run Code Online (Sandbox Code Playgroud)
之后,您首先要检查是否已分配内存,如果有问题malloc()可以保证返回一个特殊的poitner NULL,它是无效的poitner可以帮助您检查是否poitner实际上指向了有效的内存,
if (pointer != NULL)
{
pointer->quantity = 1;
pointer->value = 3.0;
strcpy(pointer->name, "My Name Is ...");
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,指针是有效的,直到您确定它是无效的为止,否则,您必须free()像这样调用
free(pointer);
Run Code Online (Sandbox Code Playgroud)
之后,如果您尝试再次访问指针,则会发生未定义的行为。
1 您也可以pointer使用以下语法pointer = malloc(sizeof(*pointer));,使其独立于的类型,因为sizeof(*pointer)它等于sizeof(struct Data)。