回 帖 发 新 帖 刷新版面

主题:请问char *train和char train[]在这里有何不同?

严版 数据结构 习题集 第24页3.16火车调度问题,下面是我写的完整的程序,就红字部分向大家请教,如果我的程序哪里写得不够规范,简洁,也请大家指教,谢谢。


#include <stdlib.h>
#include <stdio.h>

#define ERROR 0
#define OK 1
#define INFEASIBLE -1
#define NULL 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 3
#define STACKINCREMENT 3

typedef char SElemType;
typedef int Status;
typedef struct{            //定义
    SElemType *base,*top;
    int stacksize;
}SqStack;

Status InitStack(SqStack &S){
    if(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)))) return OVERFLOW;
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}

Status Push(SqStack &S,char x){
    if(S.top-S.base>=S.stacksize){
        if(!(S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)))) return OVERFLOW;
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=x;    
    return OK;
}

Status Pop(SqStack &S,char &x){
    if(S.top==S.base) return ERROR;
    else    x=*(--S.top);
    return OK;
}

Status Done(SqStack &S){
    char train[]="HSHSHSSHSH";        //为何此处将train[]改为*train,会在语句[2]处出错?
    char *p,*q;
    char temp;
    int i=1;
    q=p=train;
    while(*p!='\0'){
        if(*p=='H'){
            Push(S,*p);
            printf("第%d节车厢进栈\n",i);
        }
        else{
            printf("第%d节车厢进栈、出栈\n",i);
            *(q++)=*p;    [color=800000]//[2]为何将train[]改为*train,会在这里出错?[/color]        }                            [color=800000]//此时p指向第2个字符S,而q指向第一个字符H[/color]        i++;p++;
    }
    while(Pop(S,temp)) *(q++)=temp;
    printf("%s\n",train);
    return OK;
}

void main(){
    SqStack S;
    InitStack(S);
    Done(S);
}

回复列表 (共2个回复)

沙发

*train 是一个指针,指的是一个单一的地址,当用train++时,编译链接不会出错,但是会出现运行时的错误。因为这个时候train++得到的地址是不定的,是非法的。

而train[]中,单独的看train也是一个地址指针,不过这个时候train指向的是一个连续的地址空间的开始地址,用train++时,只要train++的范围在数组的空间范围内,就是安全的,不会出错了!

板凳

如果char train[]="HSHSHSSHSH";内存里有两处有数据,一处是常量,在整个代码的全局数据区,它就是"HSHSHSSHSH",另一处是局部变量train[],这条语句是对整个数组初始化;
如果char *train="HSHSHSSHSH";常量还是常量,但局部变量是一个指针,这条初始化是对指针的初始化,所以在后面有对这个指针所指数据区进行‘写’操作的时候就会出错,错误类型是对常量进行了赋值。

我来回复

您尚未登录,请登录后再回复。点此登录或注册