1

ポインターと構造体のコツをつかむために、Cでリンクリストの実装に取り​​組んでいます。LLデータ構造の基本的なコードは次のとおりです。

struct Node {
    void *data;
    struct Node *next;
};

struct List {
    struct Node *head;
};

void initList(struct List *list) {
    list->head = 0;
}

struct Node *addFront(struct List *list, void *data) {
    struct Node *newNode;
    newNode->data = data;
    newNode->next = list->head;
    list->head = newNode;
    return newNode;
}

これが私がint main()関数で実行したテストです:

int main() {
    /* test addFront */
    double *data1;
    double *data2;
    *data1 = 10.5;
    *data2 = 10.7;
    struct List *newList;
    initList(newList);
    addFront(newList, data1);
    printf("%s\n", newList->head->data);
    addFront(newList, data2);
    printf("%s\n", newList->head->data);

    return 0;
}

私の問題は、printfが出力を印刷していないことです。現在のところ、%sがdoubleのデータ型と一致しないため、明らかに印刷されません。文字列形式を%dに変更すると、セグメンテーション違反が発生します。->(double)キャストを追加すると、2番目の引数の型がdouble *であると表示されます。これは、表記がポインターを逆参照していると思ったため、混乱します。

道に迷いました。

4

4 に答える 4

3

あなたは逆参照data1data2ていて、それらにメモリを割り当てていません。試す:

double data1 = 10.5;

addFront(newList, &data1);

またはmalloc、この場合はすべきではないと思いますが、を行うこともできます。

また、それらを印刷する場合は、次のことを試してください。

printf("%f\n", *(double *)newList->head->data);
于 2013-02-27T21:24:09.363 に答える
3

doubleポインタdata1とにメモリを割り当てていませんdata2

実際には、ほとんどすべてのポインタにメモリを割り当てていないようです。

ポインタ自体が行うのは、メモリ内のアドレスを参照することだけです。参照される構造または変数をサポートするために必要なメモリは割り当てられません。

あなたが持っている場合

double *data1; // or any other kind of pointer

あなたは次のようなものが必要です

data1 = (double *) malloc(sizeof(double));

次に、好きなものをすべて逆参照できます。たとえば、

*data1 = 12.34;

しかし、それがなければ、カルカッタのブラックホールへのポインタを参照します。

于 2013-02-27T21:29:35.430 に答える
1

問題に対処するために何をしましたか?

「assert.h」を使用して、アサーションが正しいことを確認するか、puts/exitを含むifステートメントを使用してみてください。

特に、何かが印刷されない場合、明らかにあなたが印刷しているものはあなたが印刷したいものではないので、どこかでアサーションは失敗しなければならず、あなたの心はあなたがステップを逃したところを「クリック」します。

私がすぐにこれを行うことができない理由は、私があなたではなく、あなたがどのような主張をしているのかわからないためです。そのため、あなたよりもそれらを配置するのに時間がかかります。

また、上で指摘したように、newNodeにメモリを割り当てたり、任意のメモリにアクセスしたりしていないため、セグメンテーション違反が発生しています。

そこで修正しました。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>

struct Node {
    void *data;
    struct Node *next;
};

struct List {
    struct Node *head;
};

void initList(struct List **newList)
{
    struct List* tmpList = 0;

    assert(newList != 0);
    tmpList = (struct List*)malloc(sizeof(struct List*));
    assert(tmpList != 0);
    tmpList->head = 0;
    *newList = tmpList;
}

void addFront(struct List* list, void* data)
{
    struct Node* currNode = 0;
    struct Node* prevNode = 0;

    assert(list != 0);
    assert(data != 0);

    currNode = list->head;
    while (currNode != 0) {
        prevNode = currNode;        
        currNode = currNode->next;
    }
    if (prevNode == 0) {
        list->head = (struct Node*)malloc(sizeof(struct Node));
        list->head->data = data;
        list->head->next = 0;
    } else {
        prevNode->next = (struct Node*)malloc(sizeof(struct Node));
        prevNode->next->data = data;
        prevNode->next->next = 0;
    }
}

void test(const struct List *list)
{
    const struct Node *iter;
    assert(list != 0);
    assert(list->head != 0);
    iter = list->head;

    while (iter != 0) {
        assert(iter->data != 0);
        printf("%f\n", *((double*)iter->data));
        iter = iter->next;
    }   
}

int main()
{
    double* data1 = (double*)malloc(sizeof(double));
    double* data2 = (double*)malloc(sizeof(double));
    *data1 = 10.5;
    *data2 = 10.7;
    struct List* newList = 0;

    initList(&newList);
    assert(newList->head == 0);
    puts("pass[0].");

    addFront(newList, data1);
    assert(newList->head != 0);
    assert(newList->head->data == data1);
    puts("pass[1].");

    addFront(newList, data2);
    assert(newList->head != 0);
    assert(newList->head->data == data1);
    assert(newList->head->next != 0);
    assert(newList->head->next->data == data2);
    puts("pass[2].");

    test(newList);

    return 0;
}
于 2013-02-27T21:28:21.727 に答える
1

printf("%f")2つに加えて、4つのmallocが欠落しています。

変更された行を###:でマークしました

#include "stdlib.h"
#include "stdio.h"
struct Node {
    void *data;
    struct Node *next;
};

struct List {
    struct Node *head;
};

void initList(struct List *list) {
    list->head = 0;
}

struct Node *addFront(struct List *list, void *data) {
    struct Node *newNode = malloc(sizeof(struct Node)); //###
    newNode->data = data;
    newNode->next = list->head;
    list->head = newNode;
    return newNode;
}
int main() {
    /* test addFront */
    double *data1 = malloc(sizeof(double)); //###
    double *data2 = malloc(sizeof(double)); //###
    *data1 = 10.5;
    *data2 = 10.7;
    struct List *newList = malloc(sizeof(struct List)); //###
    initList(newList);
    addFront(newList, data1);
    printf("%f\n", *(double*)newList->head->data);//###
    addFront(newList, data2);
    printf("%f\n", *(double*)newList->head->data);//###
    // TODO: free()'s //###
    return 0;
}
于 2013-02-27T21:33:48.100 に答える