根据我的老师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
答案 0 :(得分:6)
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);
int a
运算符将不给出int *a
分配的字节数。这需要程序员来维护,通常不能直接从指针确定。
对于sizeof()
,malloc
将始终返回指针的大小,
int *a
您应该始终记住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?