簡體   English   中英

將指針設置為NULL時程序崩潰

[英]My program crashes when I set a pointer to a NULL

這讓我發瘋,我已經完成作業,但出於某些原因

for (int i = 0; i < room->num_of_challenges; i++) { // need a check
        if (strcmp(room_to_enter, room->challenges[i].challenge->name) == 0) {
            room->challenges[i].start_time = start_time;
            room->challenges[i].visitor = malloc(sizeof(room->challenges[i].visitor));
            room->challenges[i].visitor->current_challenge = malloc(sizeof(room->challenges[i].visitor->current_challenge));
            *room->challenges[i].visitor->current_challenge = room->challenges[i];
            *room->challenges[i].visitor->room_name = NULL;
            *room->challenges[i].visitor->room_name = malloc(strlen(room_to_enter)+1);
            strcpy(*room->challenges[i].visitor->room_name, room_to_enter);
            inc_num_visits(room->challenges[i].challenge);
        }
    }

該程序由於某種原因而崩潰,此時:

*room->challenges[i].visitor->room_name = malloc(strlen(room_to_enter)+1);

它是一個3頁的代碼,每個頁眉都有標題,每頁大約300行,因此我無法全部發布,下面是這些結構:

struct SChallengeActivity;
typedef struct SVisitor
{
  char *visitor_name;
  int visitor_id;
  char **room_name;
  struct SChallengeActivity *current_challenge;
} Visitor;


typedef struct SChallengeActivity
{
   Challenge *challenge;
   Visitor *visitor;
   int start_time;
} ChallengeActivity;


typedef struct SChallengeRoom
{
   char *name;
   int num_of_challenges;
   ChallengeActivity *challenges;
} ChallengeRoom;

我們不能編輯該結構,因為它是由這樣的作業給出的,我試圖將這一行設置為NULL,如下所示:

 *room->challenges[i].visitor->room_name = NULL;

並且它仍然在該行崩潰,由於某種原因,它無法到達結構中的該字段。 注意:忽略編碼,我知道我應該在每一行之后檢查malloc,但是現在我希望它能正常工作,我整夜都忙於使其工作,但我不能,有什么幫助嗎? 謝謝

為訪問者分配內存時,您僅分配了指針的大小。 挑戰中的訪問者字段僅是指向訪問者的指針。 因此,您沒有分配足夠的內存。 您應該使用:

malloc(sizeof(Visitor))

要獲得Visitor結構的實際大小並分配足夠的空間。

同樣,在分配指針之前將指針設置為null是沒有用的。 對malloc()的調用將覆蓋它們。

也,

*room->challenges[i].visitor->room_name = NULL;

room_name是一個字符**(指針到指針),這意味着它仍然是一個指針,您可以在設置它之前取消引用。

不確定為什么需要將其用作指針對指針,但是如果需要,則首先必須為一個或多個指針(例如數組)分配內存:

room->challenges[i].visitor->room_name = malloc(sizeof(char*)*1);
*room->challenges[i].visitor->room_name = malloc(strlen(room_to_enter)+1);
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM