我使用「CodeBlocks編輯器」編譯爲「C」語言,編譯器爲「GNU GCC」。 我試圖讓從這種結構的鏈接:爲什麼在從文件加載過程中啓動指針發生變化?
struct node
{
char *name;
struct node *next;
} node;
其中包含一個字符串名稱和類型節點的指針(用於保存下一個項目的地址)
我寫了下面的代碼:
void load(FILE *p);
void add(node *add);
typedef struct node
{
char *name;
struct node *next;
} node;
node *start=NULL;
int main()
{
FILE *p;
*p=fopen("FILENAME","r+");
if(p==NULL)
{
printf("Can not open the file");
getch();
return 0;
}
load(p);
return 0;
}
void add(node *add)
{
node *c=start;
if(start==NULL)
{
start=add;
start->next=NULL;
}
else
{
while((c->next)!=NULL)
{
c=c->next;
}
c->next=add;
add->next=NULL;
}
}
void load(FILE *p)
{
char line[30],*name;
while(!feof(p))
{
fscanf(p,"%s",line);
node *e=(node *)malloc(sizeof(node));
e->name=line;
//comment line1:next line adds e to link list
add(e);
printf("%s,%s\n",e->name,start->name);
}
}
,其中由FILE *p
指出該文件是一個包含以下值的記事本的文本文件:
#
Alex
Ali
通過運行代碼,我預計將查看這樣的事情:
#,#
Alex,#
Ali,#
但實際上它是別的東西:
##
AlexAlex
AliAli
這意味着start
全球指針用的改變而改變指針E(的類型的節點)。我們知道的函數malloc
每運行分配在堆一個新的空間。所以它是合理的連續值第在e
需要在load
功能的different.so不同的節點根據line1.But了不尋常的事情評論的下一行添加到鏈接列表指針start
正在改變就像指針e
一樣。 我已經允許開始改變只是當它是在開始 NULL,但它仍然繼續改變(看add函數的定義)。 發生了什麼?
可能與您的問題無關,但'while(!feof(p))'是檢查C文件結尾的錯誤方法。 –
此外,在程序執行期間,「start」使用你提供的數據。爲什麼不在Code :: Blocks中使用調試器並仔細觀察? – enhzflep
您顯示的代碼不能編譯。有幾個錯誤,例如函數'add'已被寫入兩次。因此,你在這裏發佈的內容似乎並不是你正在運行的程序。這可能會讓我們難以幫助你發現你的錯誤,你不覺得嗎? –