2 回答

TA貢獻1798條經驗 獲得超3個贊
這個問題有兩種方法解:
1.
對棧的定義不變
seqstack s1;//=NULL;
seqstack *s=&s1;
在主程序中
init(s);
2.修改初始化函數
void init(seqstack **s) /*初始化建立一個空棧*/
{
(*s)=(seqstack*)malloc(sizeof(seqstack));
(**s).top=-1;
printf("\n\nThere is a empty stack!\n");
}
在主程序中
static seqstack *s;
init(&s);
其原因(定義靜態變量會默認初值0,這個你應該知道的)是,
1.你沒給指針分配空間
2.的init(seqstack *s),按你原來的調用是值傳遞,如果你單步跟蹤后你會發現 s還是0。
所以可以說你對指針的了解老指針指向常規變量的用法,當若改變一個指針的值就應該用
指向指針的指針**p.
另外成熟的算法對分配的內存 結束時一定要釋放的,這是好的習慣,如果你做的項目一直跑個
一年半載不重啟,這樣內存早晚會被程序吃光的。

TA貢獻1853條經驗 獲得超6個贊
內存訪問失敗,我覺得是 dest="Can I";這句導致了問題,字符串除了初始化時能這樣直接等于外,其他情況一般不可以直接等于xx的,這樣之后可能導致dest變為靜態變量,所以下次你賦值到 *dest1=*src1;也就是到dest的末尾時出錯了。修改為如下就行了。
#include"stdio.h"
#include"malloc.h"
#include "string.h"
void catstr(char *dest,char *src);
void main()
{
char *dest,*src="help you ???";
if((dest=(char *)malloc(80))==NULL)
{
printf("no memory \n");
}
strcpy(dest,"Can I");
catstr(dest,src);
puts(dest);
getchar();
}
void catstr(char *dest1,char *src1)
{
while(*dest1)
{
dest1++;
}
while(*src1)
{
*dest1=*src1;
src1++;
dest1++;
}
*dest1 = '\0';
}
添加回答
舉報