Значение в указателе только обновляется, если используется - PullRequest
0 голосов
/ 02 октября 2018

только что заметил какое-то странное поведение, может кто-нибудь объяснить и сказать, что я делаю неправильно?

Я хочу реализовать Hashset, используя массив указателей на связанный список, используя C, однако, когда я добавляю свойузел связанного списка, значение данных обновляется только в том случае, если я его сначала распечатаю.

Вот мой код:

#include <stdio.h>
#define print(ref) printf(#ref" = %d\n",ref);
#define HASH_MODULE 13

typedef struct listNode{
    int data;
    struct listNode*next;
}listNode;

void addToSet(int,listNode**);
int hashCode(int);


int main(){
    listNode*linkedListHashset[HASH_MODULE];

    addToSet(10,linkedListHashset);
    print(linkedListHashset[10]->data);

    return 0;
}

void addToSet(int value, listNode**set){
    int bucket = hashCode(value);
    print(bucket);
    listNode newNode = {value};
    newNode.next = set[bucket];
    set[bucket] = &newNode;
    //print(set[bucket]->data);
}

int hashCode(int value){
    return value%HASH_MODULE;
}

Вы можете увидеть закомментированную строку, если я скомпилирую ее следующим образомэто, значение не будет сохранено, давая этот вывод (что не является тем, что я ожидал):

bucket = 10
linkedListHashset[10]->data = 0

Однако, когда я включаю закомментированную строку, здесь вывод, это действительно отражает желаемыйобновить, здесь данные в указателе ведут себя, как я ожидал:

bucket = 10
set[bucket]->data = 10
linkedListHashset[10]->data = 10

Я думаю, что это может быть артефакт компилятора или что-то, я компилирую, выполнив:

$gcc -Wall -Werror -O -o  source.c

Поэтомупредупреждений нет, все вроде в порядке.Как вы думаете?Чего мне не хватает?

1 Ответ

0 голосов
/ 02 октября 2018

В addToSet вы объявляете newNode в стеке, затем сохраняете его адрес в set[bucket] и возвращаете.Затем он становится висящим указателем, который приводит к неопределенному поведению, когда вы разыменовываете его в main.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...