簡體   English   中英

指針數組的分段錯誤

[英]Segmentation Fault with pointers arrays

根據我的調試器,我遇到了Segmentation fault ,但我不知道為什么。 這是涉及的代碼。 我錯過了什么 ?

typedef struct Process Process;
struct Process {
    unsigned int m_id;
    unsigned int m_size;
    int m_startAddr;
};

    unsigned int** memory = calloc(MEMORY_SIZE, sizeof(unsigned int*));
    Process** processList = calloc(MEMORY_SIZE, sizeof(Process*));
    unsigned int itr;
    unsigned int nb_process = 0;
    int previous_process = -1;



    for(itr = 0; itr < MEMORY_SIZE; ++itr)
    {
      if(memory[itr] != NULL)
      {  
        previous_process = *memory[itr]; // works but risk of integer overflow
        processList[nb_process]->m_id = *memory[itr]; // segfault
        processList[nb_process]->m_size = 1;         
        processList[nb_process]->m_startAddr = itr;

        nb_process++;
     }

    }
 }

編輯:我試圖進行以下更改:

Process* processList = calloc(MEMORY_SIZE,sizeof(Process));
unsigned int** memory = calloc(MEMORY_SIZE, sizeof(unsigned int*));
unsigned int nb_process = 0;
int previous_process = -1;
unsigned int itr;
Process temp;


for(itr = 0; itr < MEMORY_SIZE; ++itr)
    {
        /* if memory unit is not occupied */
        if(memory[itr] != NULL)
        {
            /* if process is not known yet */
            if(*memory[itr] != previous_process)
            {
                previous_process = *memory[itr];
                printf("previous_process %u \n", previous_process);
                temp.m_id = *memory[itr];
                temp.m_size = 1;
                temp.m_startAddr = itr;

                processList[nb_process] = temp;

                nb_process++;

            }
            /* if the process is already known */
            else
            {
                printf("size %u \n", processList[nb_process].m_size);
                processList[nb_process].m_size++;
            }
        }
    }

previous_process的輸出正確。 但是,大小的輸出出現了問題。 首先,在for循環的末尾,它總是有兩個值低於應有的值(14而不是16,30而不是32;等等...)。 更糟糕的是,計數從0開始,而應從1開始,因為我在將temp.m_size初始化為1之前將其復制到processList中。 所以該副本不起作用...為什么? 我應該使用memcpy嗎?

你做這個:

unsigned int** memory = calloc(MEMORY_SIZE, sizeof(unsigned int*));
*memory[0]

您為指針數組分配了空間,但是隨后取消了對這些指針的引用。 但是它們全為零(在大多數系統上為NULL,但無論如何都不是有效的指針,因為它來自任何地方)。 那行不通。

除了以上約翰的回答,您還分配了一個指針數組

Process** processList = calloc(MEMORY_SIZE, sizeof(Process*));
unsigned int nb_process = 0;

您必須確保使用正確的某種初始化指針數組,然后再按原樣取消引用。

暫無
暫無

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

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