c语言指针程序问题

c语言指针程序问题,第1张

swap函数中,未初始化指针t就对t解引用。

两种改正方式:

将swap函数中所有t改为t

将int t修改为int t = (int)malloc(sizeof int)

并在函数返回前添加free(t);

有点麻烦,试试~~

最近考试有点忙,~

还未通过编译,你自己看着改改,我会尽快再发给你的。~~

1、首先格式化输入到栈,形式为:(字母开始,字母结束,空格分开不同单词,空格不能连续)。

2、构建子栈,步骤:由母栈经格式化(取每个单词后半部到子栈)。

3、排序。

4、输出。

子栈元素首行格式为(堆栈元素 + 指向一数据结构的指针)

#include<ctypeh>

#include<stdioh>

#define STACK_INT_SIZE 100 //存储空间初始分配量

#define STACKINCREMENT 10 //存储空间分配增量

#define OK 0

typedef struct C_Node{

char elem;

struct C_Node next;

}C_Node;

typedef struct C_Stack{

char C_elem;

char base;

char top;

C_Node C_next;

}C_Stack;

typedef struct{

char base;

char top;

int stacksize;

}SqStack;

Status InitStack (SqStack &S)

{ Sbase=(ElemType)malloc(STACK_INIT_SIZEsizeof(ElemType));

if (!Sbase) exit (OVERFLOW); //存储分配失败

Stop = Sbase;

Sstacksize = STACK_INIT_SIZE;

return OK;

}

Status Push (SqStack &S, char e) {

if (Stop - Sbase >= Sstacksize) {//栈满,追加存储空间

Sbase=(ElemType )realloc(Sbase,(Sstacksize+STACKINCREMENT)sizeof (ElemType));

if (!Sbase) exit (OVERFLOW); //存储分配失败

Stop = Sbase + Sstacksize;

Sstacksize += STACKINCREMENT;

}

Stop++ = e;

return OK;

}

format_input()

{int Finish=0,flag;

char ch;

while(!Finish)

{flag=0;

scanf("%c",&ch);

if(' '==ch)

else if(isalpha(ch)){

if(0==flag)

else

}

else

}

}

Creat_C_Stack()

{指向 M_Stack 内元素的指针p(用于指向一个单词的最后字母),q(指向p的前方第一个空格元素);

指向 C_Stack 首行元素的指针C_i(),及随后元素的C_i_j(insert_place);

q=M_Stacktop;

p=M_Stacktop;

i=0;

q=top;

p=top-1;

num=0;

while(1)

for(;qelem!=' ';)

q--;

i=(p-q-1)/2;

Insert_P=C_Stack[num];

Insert_Pelem=pelem;

p--;

for(j=0;j<i;j--)

Insert_Pnext=Insert_Pnext;

Insert_Pelem=pelem;

p--;

if(q==M_Stack) return;

}

Sort()

{C_Stack C_p=C_Stack[j],C_q=C_Stack[j+1],C_Temp;

for(C_pnext!=NULL&&C_qnext!=NULL)

{if(C_pelem!=C_qelem){

if(C_pelem>C_qelem){

C_temp=C_p;C_q=C_p;C_p=C_temp;

}

else

}

}

}

output()

{for(i=0;i<C_num;i++){

q=C_Stack[i];printf("%c",qelem);

for(qnext!=NULL){

q=qnext;

printf("%c",qelem);

}

}

}

#include<stdioh>

void main()

{printf("只有空格和字母为有效字符,\n");

printf("其他字符将使输入结束。\n");

format_input();

Creat_C_Stack();

Sort();

Output();

}

一、指针变量的初始化问题

指针变量同普通变量一样,使用之前不仅要定义说明,而且必须进行初始化,指针的 初始值必须是一个地址,决不允许赋予任何其他数据, 通常是一个数据的地址或地址 变量或空指针。

1、指针变量未被初始化

指针变量未被初始化,指针变量就不会被分配存储空间。在程序中如果使用了未被分配 空间的指针,就会出现难以查找的错误。

如在程序

main()

{int x, p;

x= 100;

p= x;

printf(“p=%d\n”,p);

}

中,指针变量p因没有初始化,在执行语句p= x;之前p的内容是未知的,当程序将100赋给 一个没有确定指向内存的指针变量p,而使得数据100被存入一个未知的单元。这个程序虽然 很小,所占的内存小,问题不明显,但实质上它却隐含着一个致命的错误。这是因为随着程 序的增大,很有可能访问到致命的地址单元,将会导致计算机系统工作区域内有用数据的破 坏,引起数据段 *** 作系统的损毁,造成机器运行失常,甚至 “死机”。

解决方法是指针必须初始化后,才能使用。

本例中 p=&x; 程序便可正常运行。

2、指针初始值可赋值为空值 

指针变量值为0的指针称为零指针(空指针)。其表示形式为int p=0;表示p指向地 址为0的单元,系统保证该单元不作其他应用,表示指针变量值没有意义。可以写成:

#define NULL (void )0

int p=NULL;

定义零指针主要用于避免指针变量的非法引用和在程序中比较指针变量是否为空两个方 面。因此,不能把一个空指针用于除此之外的其他比较。若某些系统允许第0号内存既可以 被写入也可以被读出,这时错用空指针可能会改写 *** 作系统的一部分内容,从而使系统彻底 崩溃;若系统只允许读0号内存,这时空指针指向一个有用的字符串;若系统对0号单元实行 写保护,则对空指针的 *** 作将失败。因此,使用空指针时要特别小心。



二、指针变量赋值问题

1、指针赋值带来的内存丢失

在C语言中指针之间是可以相互赋值的,但是使用不当可能会造成部分内存的“丢失” ,即这部分内存空间不能再被该任何程序访问。如: 

main()

{float a, b;

a=(float)malloc( sizeof( float));

b=(float)malloc( sizeof( float));

a= 227 5;

b= 163 9;

a= b;

printf(“%f,%f,a, b);

}

上例中将指针变量b赋给了指针变量a,使a与b都指向分配给b的内存空间,而原先分配 给a的内存空间未释放,不能再被其它任何程序访问,该内存空间成了“无效内存块”,内 存空间“丢失”了,而a后来指向的内存单元又直接或间接地被反复调用,内存愈来愈紧张 ,最终“死机”。

解决方法:一个指针变量赋给另一个指针变量前,应先用free( )释放所占有的内存空 间,使这部分空间可以由系统重新支配,即应在赋值语句前执行:free (a)。

2、指针变量赋值错误

C语言规定,一个指针变量只能指向同类型的变量,不能时而指向一个整型变量,时而 指向一个字符型变量。当然,如果程序中确实需要进行不同类型的 指针变量进行赋值时, 则需要进行强制类型转换。

3、混淆指针变量和它所指向的数据而导致程序错误

如在程序

main()

{int x, p;

x= 10; p= x;

printf(“%d”,p);

}

中,语句p= x把数据10而不是10所对应的单元地址赋给指针变量p,因而printf()调用 语句无法在屏幕上显示x的值。



三、指针用于数组时应注意的问题

1、混淆数组名与指针变量的区别

main()

{int i, a[ 8];

for( i= 0; i< 8; i++)

scanf(“%d”,a++);

}

分析:C语言中约定,指针变量是一个变量,地址为其值;数组名是一个常量指针,在 系统为数组分配存储单元时确定,其值是该数组首元素的地址。因此数组名不能自增自减 ,也不能在赋值语句中作左值例程中企图通过对a的改变使指针下移,指向欲输入数据的数 组元素。它的错误在于不了解数组名代表的是数组首地址,是一个地址常量,而地址常量的 值是不能改变的。

2、指针越界错误

由于对内存中数据放置的错误假定,导致指针超出数据对象所占内存空间的大小。

例:main()

{int a[5], b[5] ;

int p, i ; 

p=a; 

for (i=0; i<10:i++) p++=i;}

分析:该程序想通过指针变量p的自加运算来完成用0~9初始化数组a和b,但这是建立 在数组a和b相邻存放的基础上的,事实上这种情况并不一定成立。

3、混淆数组与指针的区别

例:main()

{char p=“beijing”;

p[0]= ‘B’;}

分析:程序没有正确区分数组和指针。在C语言中,当把字符串常量赋予指针时,该字 符串常量就存储在静态存储区中。此时数据不能用指针修改,应用数组的方式进行修改。



以上就是关于c语言指针程序问题全部的内容,包括:c语言指针程序问题、用c语言指针编程、c语言程序指针问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9314825.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存