簡體   English   中英

malloc結構指針拋出分段錯誤(核心已轉儲)

[英]malloc struct pointer throwing segmentation fault (core dumped)

我有這兩個結構

struct node{
    int val;
    struct node *up;
    struct node *down;
};

struct stack {
    struct node *bottom;
};

typedef結構在頭文件中定義

typedef struct stack stack_set;

我想malloc的結構,但我不斷收到賽格故障時,我嘗試訪問node結構。 我嘗試在node結構上使用malloc無效。

    stack_set *set;
    set = malloc(sizeof(stack_set));
    set->bottom = NULL;
    set = malloc(sizeof(struct node));
    set->bottom->val = NULL;
    return set;

我在第二行代碼中遇到了段錯誤。

我如何正確地malloc代碼,以免繼續拋出seg錯誤? 我一直找不到能夠幫助解決我的問題的例子。

謝謝

看起來像是第四行的misptint(也可以混合使用rootbottom )。 嘗試這個:

stack_set *set;
set = malloc(sizeof(stack_set));
set->bottom = malloc(sizeof(struct node));
set->bottom->val = 0;     // it is better to initialize
set->bottom->up = NULL;   // all fields to avoid undefined
set->bottom->down = NULL; // behaviour in the future
return set;

另外最好檢查一下內存分配函數的結果:

stack_set *set;
set = malloc(sizeof(stack_set));
if (!set)
  return NULL;
set->bottom = malloc(sizeof(struct node));
if (!set->bottom) {
  free(set);
  return NULL;
}
set->bottom->val = 0;
set->bottom->up = NULL;
set->bottom->down = NULL;
return set;

標准的malloc(3)函數。 返回未初始化的內存。 您需要初始化它。 所以之后

    set = malloc(sizeof(struct node));

您所有的set字段都包含垃圾值(或malloc失敗並給出NULL )。 特別是,您不應該取消引用set->root ,這是未定義的行為 ,如果運氣不好,它似乎可以工作。

我建議使用calloc來獲得零內存:

   set = calloc(1, sizeof(struct stack));
   if (!set) {perror("calloc stack"); exit(EXIT_FAILURE); };
   set->bottom = calloc(1, sizeof(struct node));
   if (!set->bottom) {perror("calloc node"); exit(EXIT_FAILURE); };

如果您不能使用calloc ,請使用memset清除內存。

編譯所有警告和調試信息( gcc -Wall -g ),並使用valgrind(如果可用)。

暫無
暫無

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

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