c - malloc和指针的指针

标签 c pointers malloc pointer-to-pointer

我试图了解在使用多个级别的指针时何时需要使用malloc。例如,

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

int main() {
    typedef struct {
        char first[10];
        char last[10];
    } Person;

    Person *p;

    p = malloc(sizeof(Person));
    strcpy(p->first, "John");
    strcpy(p->last, "Doe");

    printf("First: %s Last:%s\n", p->first, p->last);

    return 0;
}

在第一个版本中,我使用的是Person *p,而我只使用malloc来为Person类型分配空间。在第二版中,我将Person *p更改为Person **p
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    typedef struct {
        char first[10];
        char last[10];
    } Person;

    Person **p;

    *p = malloc(sizeof(Person));
    strcpy((*p)->first, "John");
    strcpy((*p)->last, "Doe");

    printf("First: %s Last:%s\n", (*p)->first, (*p)->last);

    return 0;
}

即使现在还有另一个指针,我仍然只使用一个malloc

在第三个版本中,我将使用Person ***p
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    typedef struct {
        char first[10];
        char last[10];
    } Person;

    Person ***p;

    *p = malloc(sizeof(void));
    **p = malloc(sizeof(Person));
    strcpy((**p)->first, "John");
    strcpy((**p)->last, "Doe");

    printf("First: %s Last:%s\n", (**p)->first, (**p)->last);

    return 0;
}

我的问题:

1)为什么第三版中的malloc需要**p空间,但malloc不需要*p空间?它们都是指针的指针吗?

2)另外,为什么在第二版或第三版中我不需要mallocp空间?

3)在第三个版本中,malloc*p正确大小是多少?在我的64位Mac上,sizeof(void)为1,而sizeof(void*)为8,两者似乎都可以使用,但是正确的是什么?

最佳答案

  • 取消引用尚未初始化的指针(*p)会在任何情况下引起未定义的行为。
  • 在为指针分配空间时,您通常都希望通过通常使用sizeof运算符将其指向的大小分配给它的内存。后一种情况是1.的唯一异常(exception),它允许对*p进行编码。

  • 所以第三个例子看起来像这样
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct {
            char first[10];
            char last[10];
    } Person;
    
    int main(void) {
        Person ***p;
    
        p = malloc(sizeof *p); 
        *p = malloc(sizeof **p);
        **p = malloc(sizeof ***p);
        strcpy((**p)->first, "John");
        strcpy((**p)->last, "Doe");
    
        printf("First: %s Last:%s\n", (**p)->first, (**p)->last);
    
        free(**p);
        free(*p);
        free(p);
    
        return 0;
    }
    

    关于c - malloc和指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34470723/

    相关文章:

    c++ - 无法通过引用传递对象

    c - C 中的指针及其对数组的解释

    c - malloc 作为堆栈内存分配的替代方案

    c - Linux环境下malloc杀死子进程

    c - 如何将指向动态分配数组的指针作为函数参数传输

    c - 使用未声明的标识符 'ENOMEM'

    c++ - 通过套接字发送整数数组时出现问题

    c - C 中的指针问题,找不到我的错误

    c++ - 无法将 unique_ptr<Basic> 设置为 p(new Basic())

    c - 不确定堆分配创建的未初始化值在哪里