结构和结构指针之间混淆

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”的地址)?

Iha*_*imi 5

在第一种情况下,该结构的实例分配在内存中,分配的字节数等于所返回的值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)