簡體   English   中英

為什么這個C程序不能讓我訪問內存?

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

我檢查過, ifndefendif的標題是安全的,並且都包含在內。

此功能不是在列表中沒有元素時放置“ 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-> nameelement-> next未初始化,因此在print_listEl是相同的

  1. 您不應該為current分配malloc 您將立即用head替換從中獲得的指針,並松開分配。 較晚的free會釋放列表的最后一個元素,但不會將前一個元素的指針設置為NULL ,如果稍后使用該列表,則會導致未定義的行為。

  2. 您在這里為節點分配內存:

     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.

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