[英]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.