在malloc中使用和不使用指针之间的区别

时间:2018-04-16 06:54:08

标签: c

我只是想知道malloc(sizeof(* some_structure))和malloc(sizeof(some_structure))之间的区别。

我刚学习C语言,最近我遇到了一些问题。我很抱歉新手问题,但我不知道如何在谷歌上搜索它。

5 个答案:

答案 0 :(得分:3)

让我们说你有

typedef struct some_structure {
    int a;
    int b;
    int c;
} some_structure;

int main(void)
{
    some_structure *hello = NULL;
}
  • 然后,hellosome_structure *的类型:' s"结构指针"。
  • *hellosome_structure的类型:那是" some_structure"。

对于每个指针级别都会发生同样的情况:

int main(void)
{
    some_structure **hello = NULL;
}
  • 然后,hellosome_structure **的类型:' s"指针结构&#34 ;.
  • *hellosome_structure *的类型:那是" s#34; some_structure的指针"。
  • 最后,**hellosome_structure的类型:那是" some_structure"。

当你使用malloc时,你想为结构本身分配内存。然后你想要malloc some_structure本身的类型。

这就是您通常使用*some_structure的原因。

为什么不直接使用sizeof(some_structure)? 因为如果您的变量类型发生了变化。

使用some_structure *hello = malloc(sizeof(*hello)),即使您更改hello的类型,malloc仍然有效。

答案 1 :(得分:1)

第一个是获取空间,其大小由一个名为some_structure的指针所指向的变量指示,这是指针的奇怪命名。

第二个是获取空间,其大小由名为some_structure的变量指示,对于包含类似于整数的变量的变量也是奇怪的命名。

注意,其他人已经发现变量的命名非常奇怪,他们(默默地)认为你问的是一个完全不同的问题。这里的答案试图(可能稍微固执地)回答所提出的问题 请考虑澄清您的问题。如果看似合理的猜测是正确的,你会发现很多答案已经存在 (我会删除我的,如果有人吩咐我并给我几个小时的时间,因为我现在必须离开。)

答案 2 :(得分:0)

查看malloc的定义here,您可以看到malloc函数需要size_t size参数。

因此,区别在于您请求分配的大小:指向some_struct的指针,或结构本身的大小。

请注意,为了正确传递请求的大小,您必须使用sizeof()malloc(sizeof(*some_structure))malloc(sizeof(some_structure))

答案 3 :(得分:0)

请参阅以下代码以了解其中的区别:

struct abc
{
    int a, b, c;
    char d, e, f;
};

int main(){
    abc a;
    abc *b;
    printf("%zu %zu",sizeof(a), sizeof(b));
}

输出是:

16 8

指针的类型为long unsigned int,这就是大小为8的原因。

对于struct abc,size = 4 * 3 + 1 * 3 = 15(为填充添加1)

在执行some_struct时,您正在分配该结构的完整内存,而在第二种情况下(*some_struct),您只为内存分配指针。

答案 4 :(得分:0)

你的问题并不是很清楚,因为它缺乏真正的代码甚至是你真正在谈论的真正定义。但我希望这可能会对这个话题有所启发。

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

struct a{
    int b;
    long long int c;
};

int main()
{
    struct a *foo; //this is just a pointer to not allocated memory
    foo = malloc(sizeof (*foo)); //allocation of the struct for the pointer

    foo->b = 2;
    foo->c = 3;

    struct a **bar; // pointer to the pointer of struct;
    bar = malloc(sizeof (foo)); //size of a pointer
    *bar = foo;

    printf("%d\n",(*bar)->b); //bar is a pointer to foo that points to your memory for the struct  
    printf("size of pointer %d\n",sizeof foo);
    printf("size of struct %d\n",sizeof *foo);
}