資料結構實踐 初始化順序表怎麼就記憶體溢位了?

2021-07-05 07:16:50 字數 2864 閱讀 5440

有學生調程式,是要建順序表。

他的程式是這樣的:

#include 

#include

#define maxsize 50 //maxsize將用於後面定義儲存空間的大小

typedef

int elemtype; //elemtype在不同場合可以根據問題的需要確定,在此取簡單的int

typedef

struct

sqlist;

//宣告自定義函式

sqlist initlist(sqlist *l); //初始化順序表

void listinsert(sqlist *l,int i,int b); //插入函式

void displist(sqlist *l); //輸出函式

bool listempty(sqlist *l);//判定是否為空表listempty(l)

int main()

//輸出線性表displist(l)

void displist(sqlist *l)

//判定是否為空表listempty(l)

bool listempty(sqlist *l)

//初始化順序表initlist(*l)

sqlist initlist(sqlist *l)

void listinsert(sqlist *l,int i,int b) //插入函式

for(j=l->length; j>i; j--)

l->data[i]=b;

l->length++;

}

執行結果是這樣的:

他找我幫忙。基本可以斷定,記憶體使用不當,有溢位。

看一下編譯提示的資訊,有乙個警告:

d:\cb\ds\main.cpp|21|warning: 『sq』 is used uninitialized in this function [-wuninitialized]|

說在21行,sq未經初始化就使用了。通俗的說法,野指標。

圍繞著sq找。在main()函式中有:

sqlist *sq;

initlist(sq);

這裡在呼叫initlist時,實際引數sq就是野指標。但這還不是出問題的關鍵,看initlist函式的定義是:

//初始化順序表initlist(*l)

sqlist initlist(sqlist *l)

呼叫時,l得到的是野指標,但在函式裡為其分配空間了。但呼叫完,這個位址並未返回到main函式中。呼叫完initlist,sq仍然還是野指標。這是關鍵!

沿這個思路,希望能將分配的空間位址能返回給main函式。return *l就不合適了,return l是返回位址。於是,函式定義改為:

//初始化順序表initlist(*l)

sqlist *initlist(sqlist *l)

既然引數sqlist *l呼叫時給的是個野指標,不要也罷。於是改選成無參函式:

//初始化順序表initlist(*l)

sqlist *initlist()

在呼叫時,main函式定義為:

int main()

為保證程式能夠正確編譯,函式宣告等處的語法問題不一一列出。解決了這一環節的問題,程式能夠執行了,但結果:

斷定問題出在listinsert函式中。看呼叫,插入的位置用的是邏輯序(從1開始記數),但函式定義中,直接l->data[i]=b;沒有考慮物理儲存中,下標是從0開始的。

所以,在listinsert中加入乙個 i–,完成邏輯序號向物理序號的轉換,done。

正確的結果不貼圖了,最後改過的程式是:

#include 

#include

#define maxsize 50 //maxsize將用於後面定義儲存空間的大小

typedef

int elemtype; //elemtype在不同場合可以根據問題的需要確定,在此取簡單的int

typedef

struct

sqlist;

//宣告自定義函式

sqlist *initlist(); //初始化順序表

void listinsert(sqlist *l,int i,int b); //插入函式

void displist(sqlist *l); //輸出函式

bool listempty(sqlist *l);//判定是否為空表listempty(l)

int main()

//輸出線性表displist(l)

void displist(sqlist *l)

//判定是否為空表listempty(l)

bool listempty(sqlist *l)

//初始化順序表initlist(*l)

sqlist *initlist()

void listinsert(sqlist *l,int i,int b) //插入函式

i--;

for(j=l->length; j>i; j--)

l->data[i]=b;

l->length++;

}

資料結構 順序表的初始化

include include define ok 1 define overflow 2 define maxsize 100 define list init size 10 線性表儲存空間的初始分配量 typedef int status status是函式資料型別 其值是函式結果狀態,如ok...

C 資料結構 順序表初始化及其增刪改查

include include define maxsize 20 順序表的最大長度 define n 11 using namespace std 實現順序表的初始化和增刪改查 注意 該程式預設順序表的第0個位置不用,元素從1開始存放 typedef struct sqlist 順序表初始化函式 ...

資料結構 順序表初始化時必須傳位址

順序表在進行初始化操作中必須傳位址,否則,一切都是徒勞。以下,通過畫圖的形式詳細介紹為什麼要傳位址而不能傳值 大家了解c語言的肯定知道傳值和傳址的區別,但是在學習資料結構時不得不強調傳址的重要性。傳值 圖1.17中程式執行時,先給實參 sl 分配一塊儲存空間,sl 中包括 data 100 及 nl...