[英]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.