为什么要使用malloc()?为什么变量的大小没有增加?

时间:2019-07-23 06:58:54

标签: c

根据我的老师malloc的回答,动态分配内存,然后为什么输出显示为正常变量和malloc();分配了相同的大小。我是编程的新手,所以我想您会以新手可以理解的方式回答我的问题。

#include<stdio.h>

int main()
{
    int a,b;
    a = (int *) malloc(sizeof(int)*2);
    printf("The size of a is:%d \n",sizeof(a));
    printf("The size of b is:%d \n",sizeof(b));
    return 0;
}

输出:

The size of a is:4
The size of b is:4

2 个答案:

答案 0 :(得分:6)

  1. Malloc用于指针。您要声明一个整数Scene mainScene = SceneManager.GetSceneByName("Main"); GameObject[] gameObjects = mainScene.GetRootGameObjects(); GameManager gameManager = gameObjects[0].GetComponent<GameManager>(); List<LanguageCategory> languageCategories = new List<LanguageCategory>(); LanguageCategoryPackInfo l1 = new LanguageCategoryPackInfo(); l1.displayName = "t1"; LanguageCategoryPackInfo l2 = new LanguageCategoryPackInfo(); l2.displayName = "t2"; languageCategories.Add(l1); languageCategories.Add(l2); // record an undo point Undo.RecordObject(gameManager, "languages added"); gameManager.LanguageCategoryPackInfos = languageCategories; // mark the object dirty so it will be saved EditorUtility.SetDirty(gameManager); // or simply directly EditorSceneManager.MarkSceneDirty(); EditorSceneManager.SaveScene(mainScene); 。这需要更改为Scene mainScene = SceneManager.GetSceneByName("Main"); GameObject[] gameObjects = mainScene.GetRootGameObjects(); GameManager gameManager = gameObjects[0].GetComponent<GameManager>(); SerializedObject serializedObject = new SerializedObject(gameManager); SerializedProperty languageCategories = serializedObject.FindProperty("LanguageCategoryPackInfos"); // load the current real values into the serializedObject serializedObject.Update(); languageCategories.arraySize = 2; SerializedProperty l1 = languageCategories.GetArrayElementAtIndex(0); l1.FindPropertyRelative("displayName").stringValue = "t1"; SerializedProperty l2 = languageCategories.GetArrayElementAtIndex(1); l2.FindPropertyRelative("displayName").stringValue= "t2"; // writes the changes bakc to the actual properties and marks them as dirty etc serializedObject.ApplyModifiedProperties(); EditorSceneManager.SaveScene(mainScene);

  2. int a运算符将不给出int *a分配的字节数。这需要程序员来维护,通常不能直接从指针确定。

  3. 对于sizeof()malloc将始终返回指针的大小,

    int *a
  4. 您应该始终记住sizeof(a)使用malloc分配的内存

    int *a;
    printf("%zu\n",sizeof(a));   // gives the size of the pointer e.g. 4
    a = malloc(100 * sizeof(int));
    printf("%zu\n",sizeof(a));    // also gives the size of the pointer e.g. 4
    

编辑对于free输出,free(a); 格式说明符应为printf。请参阅下面的评论。

答案 1 :(得分:1)

您将两个变量都声明并定义为int。对sizeof()的值没有其他影响。

int a,b;

这会为其中一个非常特殊的整数分配一个值,但是不会a仍然是一个整数这一事实不变(并且您的类型转换会产生误导,并且根本不做任何事情,甚至更不用说更改a了)。

a = (int *) malloc(sizeof(int)*2);

为了将上述行更改为明智的设置(即有意义地使用malloc),应如下所示:

int* a;
a= malloc(sizeof(int)*2);

a现在是一个指向int的指针,并获取可以存储两个int的区域的地址。不需要演员。
这样,sizeof(a)(在许多机器上)仍将是4,通常是指针的大小。它所指向的大小无关紧要。

使用malloc()的实际原因由其所使用程序的更大范围的目标确定。在这个人为的简短示例中,这是不可见的。完成一些与指针相关的教程。寻找“链表”或“二叉树”将使您步入正轨。
有意义地使用malloc的程序的共同点是,它们正在处理的数据结构在编译时未知,并且可以在运行时更改。未知的属性可能只是总大小,但是特别是在树木的情况下,较大的结构通常也是未知的。

使用malloc()时需要注意一个有趣的方面:​​
Do I cast the result of malloc?