声明一个包含指向该类型结构的指针数组的结构

时间:2017-08-10 14:21:00

标签: c file

我正在尝试编写文件管理器,并希望使用包含子文件夹数组的文件夹。

我在考虑像

这样的东西
struct folder {
 char* name;
 struct folder subfolders [10];
}

这有可能吗?

3 个答案:

答案 0 :(得分:4)

不,struct类型不可能包含相同类型的数组(因为该类型通常被诊断为不完整)。此外,如果该类型的每个变量都包含一个或多个相同类型的成员,则类型定义将是无限递归的(包含A的A包含A .....)。

但是,struct类型可以包含指针

struct folder1
{
    char* name;
    struct folder1 *a_subfolder;
};

或指针数组

struct folder2
{
    char* name;
    struct folder2 *subfolders [10];
};

在这两种情况下,使用这些类型的代码都需要注意确保指针是正确初始化的,并且它们可以合理地工作(例如,不尝试访问未初始化指针的值,而不是取消引用NULL等) 。在使用这种构造之前阅读指针 - 指针错误通常意味着程序以可怕的方式崩溃。

答案 1 :(得分:0)

08-10 16:04:29.696 2567-2567/sg.edu.tp.project1 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                  Process: sg.edu.tp.project1, PID: 2567
                                                                  java.lang.IllegalStateException: Could not execute method for android:onClick
                                                                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                                                                      at android.view.View.performClick(View.java:5637)
                                                                      at android.view.View$PerformClick.run(View.java:22429)
                                                                      at android.os.Handler.handleCallback(Handler.java:751)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                      at android.os.Looper.loop(Looper.java:154)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                                                                   Caused by: java.lang.reflect.InvocationTargetException
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                                                                      at android.view.View.performClick(View.java:5637) 
                                                                      at android.view.View$PerformClick.run(View.java:22429) 
                                                                      at android.os.Handler.handleCallback(Handler.java:751) 
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                      at android.os.Looper.loop(Looper.java:154) 
                                                                      at android.app.ActivityThread.main(ActivityThread.java:6119) 
                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
                                                                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
                                                                      at sg.edu.tp.project1.PlayMusicActivity.playOrPauseMusic(PlayMusicActivity.java:106)
                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                                                                      at android.view.View.performClick(View.java:5637) 
                                                                      at android.view.View$PerformClick.run(View.java:22429) 
                                                                      at android.os.Handler.handleCallback(Handler.java:751) 
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                      at android.os.Looper.loop(Looper.java:154) 
                                                                      at android.app.ActivityThread.main(ActivityThread.java:6119) 
                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

对于每个@Peter精确答案是不可能的,因为struct folder { char* name; struct folder subfolders [10]; // bad } 在需要完整定义之前尚未完全定义。 `

  

这有可能吗?

是的,考虑动态分配:

创建功能以创建,添加子文件夹和删除。可能有许多改进。

struct folder

答案 2 :(得分:-1)

简短的回答是肯定的,这样的效果可行。您可能需要添加struct folder parentfolder,以便向上和向下导航。