1. 程式人生 > >在函式中完成結構體的初始化

在函式中完成結構體的初始化

今天在實現一個單鏈表的時候,想借助一個函式完成連結串列頭節點的初始化

#include<stdio.h>
#include<stdlib.h>
// this program is to give an examble of single list
// this program contain three algorithem . those are insert,delect and print
typedef struct node{
int data;
struct node* next;
   } Lnode;

int init(Lnode* head);

int main(void)
{
char ch;
Lnode *head;
int nodeData;
if(init(head))
printf("the head node has been assigned\n");

       printf("%d",head->data);       //---------------------->這裡出錯了

return 0;

}

int init(Lnode * head)
{


head=(Lnode*)malloc(sizeof(Lnode));
if(NULL==head)
{
printf("overflow");
exit(1);
};
head->next=NULL;
head->data=0;
return 1;
}

程式編譯,執行,當在main函式中引用head的值的時候,程式報錯並退出。經過仔細分析,在使用函式對head進行初始化的時候,指標的使用出啦問題:

這個問題可以這樣描述:程式呼叫init對和head進行初始化的時候,傳送啦head的值(一個隨機的地址),init函式中,head是一個臨時的指標,其存放的是主函式中傳遞過來的值。這個值又被分配的malloc分配的空間地址覆蓋。函式沒有返回值,所以當函式呼叫結束後,在子函式中分配的記憶體就被洩漏出去啦,找不到啦。主函式中的head指標的值沒有發生改變,指向一個隨機分配的空間,當引用這個指標的時候,就發生啦錯誤。

這個問題對指標使用有一定的啟示,在使用指標的函式呼叫中,指標的作用是傳遞它所指空間的地址,只能改變所指空間裡的內容,而不能改變源指標變數的值。

相關推薦

函式完成結構初始

今天在實現一個單鏈表的時候,想借助一個函式完成連結串列頭節點的初始化 #include<stdio.h> #include<stdlib.h> // this program is to give an examble of single list

結構初始結構指標.結構陣列.結構函式的呼叫賦值等

#include "stdio.h" #include "stdlib.h" #include "string.h" int fun(void); /************************************* int ARRSCORE[3]={133,123

結構初始的陣列賦值

下面這種結構體初始化陣列賦值是沒有問題的 #include<iostream> using namespace std; struct Param { float a[5]; int n

總結C++幾種結構初始的方法

部落格地址:http://www.cnblogs.com/vongang/ 結構體能自由組裝資料,是一種很常見的資料打包方法。 當我們定義一個結構體後,沒有初始化就使用,就會使用到垃圾資料,而且這種錯誤很難發現。 在程式設計時對於定義的任何變數,我們最好都先初始化。 除了使

Linux下C結構初始

直觀 tro 擴展性 方式 建議 struct 初始化方式 www 寫到 原文地址在這裏: http://www.cnblogs.com/Anker/p/3545146.html 我 只把裏面的主要介紹和代碼寫到這裏了. 順序初始化   教科書上講C語言結構體初始化

結構初始及定義1

HA int tdi %d struct 初始 student har nbsp #include<stdio.h> struct student{ int num; char name[20]; float score; }; int m

memset結構初始

http log 結構 sha 方便 AR test name truct memset可以方便的清空一個結構類型的變量或數組。    如:   struct sample_struct   {   char csName[16];   int iSeq;   int iT

結構初始

upload image scrip mat roc java span tag 授權 結構體初始化 如果結構體沒有實現任何初始化函數,Swift 默認給生成一個包含所有成員變量的初始化構造器。 struct RocketConfiguration { let

自定義型別 結構體型別建立 結構初始

結構體 結構體的基礎知識: 結構是一些值的集合,這些值稱為成員變數。結構的每個成員可以是不同型別的變數。 結構體的宣告: struct tag //struct是結構體關鍵字,tag為結構體標籤 { member-list; //成員列表 }variable-list;//變

結構初始方法

三種方式都可以:   1 #include <stdio.h>   2 typedef struct {   3     int a;   4     int b;

c++結構初始

https://blog.csdn.net/qq_30835655/article/details/76850894 struct job { string name; int salary; job(string _name,int _sala

1.結構體型別建立 2.結構初始 3.結構記憶體對齊 4.位段,位段計算機大小。 5.列舉 6.聯合

結構體型別的建立 1.結構體的宣告 結構是一些值的集合,這些值稱為成員變數。每個結構體的成員可以是不同型別的變數。 struct Student { char name[20];//名字 short age;//年齡 char sex[5

c: 結構初始的四種方法

定義 struct InitMember { int first; double second; char* third; float four; }; 方法一:定義時賦值 struct InitMember test = {-10,3.141590,“method one”,0.25};

結構初始 訪問的三種方式(結構指標)

輸出三個學生中成績最高的學生資訊 1>  #include<stdio.h> typedef struct student {     int num;     char name[10];     int score; } Student; int m

C語言--結構初始

一、結構體基本初始化方法 定義 struct Mystruct { int first; double second; char* third; float four; }; 1、方法一:定義時賦值 賦值時注意定義時各個成員的順序,不能錯位。

C語言結構初始的四種方法

定義 struct InitMember { int first; double second; char* third; float four; }; 方法一:定義時賦值 struct InitMember t

結構初始

對結構體 struct a { int b; int c; } 有幾種初始化方式: struct a a1 = {  .b = 1,  .c = 2 }; 或者 struct a a1 = {  b:1,  c:2 } 或者 struct a a1 =

C語言結構初始結構指標

結構體初始化 #include <stdio.h> //結構體的宣告和定義方法 //1.宣告和定義分離 struct weapon{ char name[20]; in

陣列,結構初始 {0}

  一直以為 int a[256]={0};是把a的所有元素初始化為0,int a[256]={1};是把a所有的元素初始化為1. 除錯的時檢視記憶體發現不是那麼一回事,翻了一下《The C++ Programming Language》總算有定論。PDF的竟然不然複製,

C/C++結構初始與賦值

1.結構體的初始化 結構體是常用的自定義構造型別,是一種很常見的資料打包方法。結構體物件的初始化有多種方式,分為指定初始化、順序初始化、建構函式初始化。假如有如下結構體。 struct A { int b; int c; } (1)指定初始