簡體   English   中英

指向無法訪問二維數組值的結構的指針

[英]Pointer to a structure unable to access values of 2D array

我目前正在編寫一個充當電路的程序。 我有一個門結構,它采用二維字符數組來保存變量名,但是當我嘗試訪問存儲在 while 循環之外的數組中的這些變量名時,內容為空。

typedef struct Gate
{
    kind_t kind;
    int size;     // size of DECODER and MULTIPLEXER
    char **params; // length determined by kind and size (CHANGED FROM INT TO CHAR)
                  // includes inputs and outputs, indicated by variable numbers
} Gate;

typedef struct Node
{
    Gate *data;
    struct Node *next;
} Node;
// Linked list of gates & attributes
    while (fscanf(fp, "%16s", str) != EOF)
    {
        if (strcmp(str, "AND") == 0)
        {
            head = makeGate(fp, head, AND);
            length++;
        }
        else if (strcmp(str, "OR") == 0)
        {
            head = makeGate(fp, head, OR);
            length++;
        }
        else if (strcmp(str, "NAND") == 0)
        {
            head = makeGate(fp, head, NAND);
            length++;
        }
        else if (strcmp(str, "NOR") == 0)
        {
            head = makeGate(fp, head, NOR);
            length++;
        }
        else if (strcmp(str, "XOR") == 0)
        {
            head = makeGate(fp, head, XOR);
            length++;
        }
        else if (strcmp(str, "NOT") == 0)
        {
            //head = makeGate(fp, head, NOT);
            //length++;
        }
        else if (strcmp(str, "PASS") == 0)
        {
            //head = makeGate(fp, head, PASS);
            //length++;
        }
        else if (strcmp(str, "DECODER") == 0)
        {
            //
        }
        else if (strcmp(str, "MULTIPLEXER") == 0)
        {
            //
        }
        printf("%s\n", head->data->params[2]);
    }

    // plugs in values to circuit
    for (int i = 0; i < 3; i++)
    {
        printf("Stored string: %s\n", head->data->params[i]);
    }

`

Node *makeGate(FILE *fp, Node *head, kind_t inGate)
{
    char str[17];
    Node *new_node = (Node *)malloc(sizeof(Node)); // Node of linkedlist that contains gate structure
    new_node->data = (Gate *)malloc(sizeof(Gate)); // Gate structure that keeps information about a gate
    new_node->next = head;

    new_node->data->kind = inGate;
    new_node->data->size = 3;
    new_node->data->params = malloc(3 * sizeof(char*));
    for (int i = 0; i < 3; i++)
    {
        new_node->data->params[i] = malloc(17 * sizeof(char));
    }

    fscanf(fp, "%16s", str);
    new_node->data->params[0] = str;
    fscanf(fp, "%16s", str);
    new_node->data->params[1] = str;
    fscanf(fp, "%16s", str);
    new_node->data->params[2] = str;
    return new_node;
}

` while 循環內的 printf 語句工作得很好,純粹是為了測試,但是打印數組每個值的 for 循環是不同的,什么也不打印。

我嘗試多次修復此問題但無濟於事,我最初發現此問題是因為我注意到我有 memory 泄漏,當我釋放 memory 泄漏應該在的位置時,它拋出我正在釋放一個未分配的地址。

我唯一的想法是我不知何故丟失/跳過了一個節點,但我沒有想法

以下不會數據str復制到struct中(您需要strcpy ):

new_node->data->params[0] = str;

它所做的是將str地址復制到每個元素中。 它們都指向相同的緩沖區/字符串。 並且,當 function 返回時, str從 scope 中消失。

可以[並且應該] 直接掃描到結構中。

所以,改變:

fscanf(fp, "%16s", str);
new_node->data->params[0] = str;

fscanf(fp, "%16s", str);
new_node->data->params[1] = str;

fscanf(fp, "%16s", str);
new_node->data->params[2] = str;

進入:

fscanf(fp,"%16s",new_node->data->params[0]);
fscanf(fp,"%16s",new_node->data->params[1]);
fscanf(fp,"%16s",new_node->data->params[2]);

暫無
暫無

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

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