簡體   English   中英

如何在main之外初始化一個指針?

[英]How to initialize a pointer outside of main?

我正在嘗試在 c 中實現節點列表:

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

typedef struct{
    int value;
    void *next;
} node_t;

void printlist(node_t*head){
    for(node_t*i=head;i;i=i->next)
        printf("%i\n",i->value);
}

node_t create(int value){
    node_t *ret = malloc(sizeof(node_t));
    ret->value=value;
    ret->next=0;
    return *ret;
}

int main(){
    int i=0;
    node_t*head=0;
    for(node_t*tmp;i++<10;head=tmp)
    {
        *tmp=create(i+100);
        tmp->next=head;
    }
    printlist(head);
}

在 for 循環中,我使用 node_t* 指針,該指針分配給在create function 外部已初始化的(通過malloc )結構。 但程序發出:

warning: ‘tmp’ may be used uninitialized in this function [-Wmaybe-uninitialized]
   *tmp=create(i+100);

Command terminated

那么如何為c中已經初始化的數據分配一個取消引用的指針呢?

當你第一次進入循環時, tmp不指向任何東西。 因此,取消引用指針是無效的。

此外,您在create中有 memory 泄漏。 您為一個節點動態分配 memory,然后返回該節點的副本,沒有任何東西可以指向分配的 memory。

您可以通過從 function 返回一個指針來解決這些問題:

node_t *create(int value){
    node_t *ret = malloc(sizeof(node_t));
    ret->value=value;
    ret->next=0;
    return ret;
}

然后在調用 function 時將該指針保存在tmp中:

    tmp=create(i+100);

對於初學者來說,function create 應該返回指向動態創建節點的指針。 否則您將無法釋放已分配的節點,因為 function 返回已創建節點的副本。

所以重寫 function 至少像

node_t * create(int value){
    node_t *ret = malloc(sizeof(node_t));
    ret->value=value;
    ret->next=0;
    return ret;
}

在 main 的 for 循環中,您使用的是未初始化的指針 tmp。 因此,使用您定義的創建的 function 實現,由於帶下划線的賦值,循環調用未定義的行為

for(node_t*tmp;i++<10;head=tmp)
{
    *tmp=create(i+100);
    ^^^^^^^^^^^^^^^^^^ 
    tmp->next=head;
}

所以在改變 function 創建改變循環后

for(node_t*tmp;i++<10;head=tmp)
{
    tmp=create(i+100);
    tmp->next=head;
}

這是您更新的程序。

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

typedef struct{
    int value;
    void *next;
} node_t;

void printlist(node_t*head){
    for(node_t*i=head;i;i=i->next)
        printf("%i\n",i->value);
}

node_t * create(int value){
    node_t *ret = malloc(sizeof(node_t));
    ret->value=value;
    ret->next=0;
    return ret;
}

int main(){
    int i=0;
    node_t*head=0;
    for(node_t*tmp;i++<10;head=tmp)
    {
        tmp=create(i+100);
        tmp->next=head;
    }
    printlist(head);
}

它的 output 是

110
109
108
107
106
105
104
103
102
101

暫無
暫無

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

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