[英]Why won't this C program let me access memory?
我試圖建立一個鏈表數據庫,由於某種原因,該程序不允許我訪問內存,或者至少這就是調試器所說的。 我正在使用gdb調試器,代碼塊。
我已經在具有相同操作系統(Windows)的另一台機器上編譯了該程序。 它運行完美,但是調試器顯示了相同的錯誤。
void print_ListEl(ListEl* head)
{
ListEl* current = malloc(sizeof(ListEl));
current = head;
if (head==NULL) exit(EXIT_FAILURE);
if (current->next==NULL)
{
puts("No elements");
return;
}
else
{
int i=1;
while(current->next!=NULL)
{
printf("%d.%s\n", i, current->name);
current=current->next;
++i;
}
}
free(current);
}
它的用法是這樣的:
ListEl* element = malloc(sizeof(ListEl));
print_listEl(element);
根據調試器,這似乎是導致問題的函數。 當我看到“ current-> next”變量時,調試器會顯示“無法訪問地址處的內存”。 如果我將current-> next更改為current,調試器仍然顯示與導致問題相同的功能。 ListEl結構只是帶有char類型數據的常規單鏈表。
struct ListEl
{
char name[MAX_CHAR];
struct ListEl* next;
};
我也用
typedef struct ListEl ListEl
我檢查過, ifndef和endif的標題是安全的,並且都包含在內。
此功能不是在列表中沒有元素時放置“ No elements”,而是噴出一些隨機字符並使程序崩潰。
也許
ListEl* current = malloc(sizeof(ListEl));
current = head;
一定是
ListEl* current = malloc(sizeof(ListEl));
head = current;
否則為什么要立即執行malloc並將其丟失?
我希望您之前有其他代碼
if (current->next==NULL)
因為僅分配電流,而不初始化
當我看到“ current-> next”變量時,調試器會顯示“無法訪問地址處的內存”。
這意味着current已中斷,因為例如已將其刪除,或者您從未從未初始化next字段。 問題是您沒有給出最小,完整和可驗證的示例
如果您的代碼確實是這樣的:
ListEl* element = malloc(sizeof(ListEl));
print_listEl(element);
element-> name或element-> next未初始化,因此在print_listEl
是相同的
您不應該為current
分配malloc
。 您將立即用head
替換從中獲得的指針,並松開分配。 較晚的free
會釋放列表的最后一個元素,但不會將前一個元素的指針設置為NULL
,如果稍后使用該列表,則會導致未定義的行為。
您在這里為節點分配內存:
ListEl* element = malloc(sizeof(ListEl));
但是您永遠不要在調用print_listEl(element);
之前設置其任何值print_listEl(element);
。 因此,指針element->next
將不確定,並且與NULL
比較將無用。 您稍后在print_listEl
取消引用此指針,從而導致未定義的行為。 總是在malloc
之后初始化:
ListEl* element = malloc(sizeof(ListEl)); element->next = NULL; memset(element->name, '\\0', sizeof(element->name));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.