user-0 提问: 关于数组的顺序存储的问题

回复:
user: user-0
content: 引用 7 楼 cfjtaishan 的回复:#include<stdio.h> #include<stdarg.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 //#define NULL 0 #define    MAX_ARRAY_DIM 8 typedef int ElemType; typedef struct {     ElemType *base;     int dim;     int *bounds;     int *constants; }Array; //构造 int InitArray(Array *A, int dim,...) {     int i;     int elemtotal=1;     va_list ap;     if(dim<1||dim>MAX_ARRAY_DIM)         return ERROR;     A->dim = dim;     A->bounds = (int *)malloc(dim * sizeof(int));     if(!A->bounds) exit (OVERFLOW);     va_start(ap,dim);     for(i = 0; i < dim; i++)     {         A->bounds[i] = va_arg(ap,int);         if(A->bounds[i]<0)             return OVERFLOW;         elemtotal *= A->bounds[i];     }     va_end(ap);     A->base=(ElemType *)malloc(elemtotal * sizeof(ElemType));     A->constants=(int *)malloc(dim * sizeof(int));     if(!A->constants)         exit (OVERFLOW);     A->constants[dim-1]=1;     for(i=dim-2;i>=0;i--)         A->constants[i] = A->bounds[i+1] * A->constants[i+1];     return OK; } //销毁 int DestroyArray(Array *A) {     if(!A->base)         return ERROR;     free(A->base);     A->base=NULL;     if(!A->bounds)         return ERROR;     free(A->bounds);     A->bounds=NULL;     if(!A->constants)         return ERROR;     free(A->constants);     A->constants=NULL;      return OK; } //定位 int LocateArray(Array A,va_list ap,int *off) {     int ind,i;     //off=0;     for(i=0;i<A.dim;i++)     {         ind=va_arg(ap,int);         if(ind<0||ind>=A.bounds[i])             return OVERFLOW;         *off += A.constants[i] * ind;     }     return OK; } //分配 int AssignArray(Array *A,ElemType e,...) {     va_list ap;     int off = 0, result;    /* Initize the argu: off */     va_start (ap,e);     if((result = LocateArray(*A, ap, &off))<=0)         return result;     *(A->base+off)=e;     va_end(ap);     return OK; } //显示值 int ValueArray(Array A, ElemType *e,...) {     va_list ap;     int off = 0,result;    /* Initize the argu: off*/     va_start (ap,e);     if((result=LocateArray(A, ap, &off))<=0)         return result;     *e = *(A.base + off);     va_end(ap);     return OK; } int main() {     Array A;     ElemType e,n;     int i,j,k,a[3];     int dim=3;     printf("请输入各维长度（三维）：\n");     for(i=0;i<3;i++)         scanf("%d",&a[i]);     InitArray(&A, dim, a[0], a[1], a[2]);     printf("请输入各元素：\n");     for(i=0; i < a[0];i++)         for(j=0;j<a[1];j++)             for(k=0;k<a[2];k++)             {                 scanf("%d",&e);                 AssignArray(&A,e,i,j,k);             }     for(i=0;i<a[0];i++)         for(j=0;j<a[1];j++)             for(k=0;k<a[2];k++)             {                 ValueArray(A, &e,i,j,k);                 printf("%d\t",e);             }     return 0; } 试试这个版本，我之前是这样实现的，然后把指针都改成了引用，因为C语言不支持&引用的定义。 另外，遇到问题急我没有用，主要是拿出时间好好研究一下问题。 确实这样就可以了，十分感谢！

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 主要是调试的时候也不知道问题在哪，谢谢您的指教~

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: #include<stdio.h> #include<stdarg.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 //#define NULL 0 #define    MAX_ARRAY_DIM 8 typedef int ElemType; typedef struct {     ElemType *base;     int dim;     int *bounds;     int *constants; }Array; //构造 int InitArray(Array *A, int dim,...) {     int i;     int elemtotal=1;     va_list ap;     if(dim<1||dim>MAX_ARRAY_DIM)         return ERROR;     A->dim = dim;     A->bounds = (int *)malloc(dim * sizeof(int));     if(!A->bounds) exit (OVERFLOW);     va_start(ap,dim);     for(i = 0; i < dim; i++)     {         A->bounds[i] = va_arg(ap,int);         if(A->bounds[i]<0)             return OVERFLOW;         elemtotal *= A->bounds[i];     }     va_end(ap);     A->base=(ElemType *)malloc(elemtotal * sizeof(ElemType));     A->constants=(int *)malloc(dim * sizeof(int));     if(!A->constants)         exit (OVERFLOW);     A->constants[dim-1]=1;     for(i=dim-2;i>=0;i--)         A->constants[i] = A->bounds[i+1] * A->constants[i+1];     return OK; } //销毁 int DestroyArray(Array *A) {     if(!A->base)         return ERROR;     free(A->base);     A->base=NULL;     if(!A->bounds)         return ERROR;     free(A->bounds);     A->bounds=NULL;     if(!A->constants)         return ERROR;     free(A->constants);     A->constants=NULL;      return OK; } //定位 int LocateArray(Array A,va_list ap,int *off) {     int ind,i;     //off=0;     for(i=0;i<A.dim;i++)     {         ind=va_arg(ap,int);         if(ind<0||ind>=A.bounds[i])             return OVERFLOW;         *off += A.constants[i] * ind;     }     return OK; } //分配 int AssignArray(Array *A,ElemType e,...) {     va_list ap;     int off = 0, result;    /* Initize the argu: off */     va_start (ap,e);     if((result = LocateArray(*A, ap, &off))<=0)         return result;     *(A->base+off)=e;     va_end(ap);     return OK; } //显示值 int ValueArray(Array A, ElemType *e,...) {     va_list ap;     int off = 0,result;    /* Initize the argu: off*/     va_start (ap,e);     if((result=LocateArray(A, ap, &off))<=0)         return result;     *e = *(A.base + off);     va_end(ap);     return OK; } int main() {     Array A;     ElemType e,n;     int i,j,k,a[3];     int dim=3;     printf("请输入各维长度（三维）：\n");     for(i=0;i<3;i++)         scanf("%d",&a[i]);     InitArray(&A, dim, a[0], a[1], a[2]);     printf("请输入各元素：\n");     for(i=0; i < a[0];i++)         for(j=0;j<a[1];j++)             for(k=0;k<a[2];k++)             {                 scanf("%d",&e);                 AssignArray(&A,e,i,j,k);             }     for(i=0;i<a[0];i++)         for(j=0;j<a[1];j++)             for(k=0;k<a[2];k++)             {                 ValueArray(A, &e,i,j,k);                 printf("%d\t",e);             }     return 0; } 试试这个版本，我之前是这样实现的，然后把指针都改成了引用，因为C语言不支持&引用的定义。 另外，遇到问题急我没有用，主要是拿出时间好好研究一下问题。

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:[quote=引用 4 楼 weixin_37969367 的回复:] [quote=引用 2 楼 cfjtaishan 的回复:] #include<stdio.h> #include<stdarg.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 //#define NULL 0 #define    MAX_ARRAY_DIM 8 typedef int ElemType; typedef struct {     ElemType *base;     int dim;     int *bounds;     int *constants; }Array; //构造 int InitArray(Array &A, int dim,...) {     int i;     int elemtotal=1;     va_list ap;     if(dim<1||dim>MAX_ARRAY_DIM)         return ERROR;     A.dim=dim;     A.bounds = (int *)malloc(dim * sizeof(int));     if(!A.bounds) exit (OVERFLOW);     va_start(ap,dim);     for(i=0;i<dim;i++)     {         A.bounds[i]=va_arg(ap,int);         if(A.bounds[i]<0)             return OVERFLOW;         elemtotal *= A.bounds[i];     }     va_end(ap);     A.base=(ElemType *)malloc(elemtotal * sizeof(ElemType));     A.constants=(int *)malloc(dim * sizeof(int));     if(!A.constants) exit (OVERFLOW);     A.constants[dim-1]=1;     for(i=dim-2;i>=0;i--)         A.constants[i]=A.bounds[i+1]*A.constants[i+1];     return OK; } //销毁 int DestroyArray(Array &A) {     if(!A.base) return ERROR;     free(A.base); A.base=NULL;     if(!A.bounds) return ERROR;     free(A.bounds); A.bounds=NULL;     if(!A.constants) return ERROR;     free(A.constants); A.constants=NULL;     return OK; } //定位 int LocateArray(Array A,va_list ap,int &off) {     int ind,i;     //off=0;     for(i=0;i<A.dim;i++)     {         ind=va_arg(ap,int);         if(ind<0||ind>=A.bounds[i])             return OVERFLOW;         off +=A.constants[i] * ind;     }     return OK; } //分配 int AssignArray(Array &A,ElemType e,...) {     va_list ap;     int off = 0,result;    /* Initize the argu: off */     va_start (ap,e);     if((result=LocateArray(A,ap,off))<=0)         return result;     *(A.base+off)=e;     va_end(ap);     return OK; } //显示值 int ValueArray(Array A,ElemType &e,...) {     va_list ap;     int off = 0,result;    /* Initize the argu: off*/     va_start (ap,e);     if((result=LocateArray(A,ap,off))<=0)         return result;     e=*(A.base+off);     va_end(ap);     return OK; } int main() {     Array A;     ElemType e,n;     int i,j,k,a[3];     int dim=3;     printf("请输入各维长度（三维）：\n");     for(i=0;i<3;i++)         scanf("%d",&a[i]);     InitArray(A,dim,a[0],a[1],a[2]);     printf("请输入各元素：\n");     for(i=0; i < a[0];i++)         for(j=0;j<a[1];j++)             for(k=0;k<a[2];k++)             {                 scanf("%d",&e);                 AssignArray(A,e,i,j,k);             }     for(i=0;i<a[0];i++)         for(j=0;j<a[1];j++)             for(k=0;k<a[2];k++)             {                 ValueArray(A,e,i,j,k);                 printf("%d\t",e);             }     return 0; }   两个问题： 1. NULL不用在define，因为stdio.h文件里已经定义，如果重定义建议定义成如下： #define NULL (void*)0 2. 初始化off，代码里有注释，否则随机数会导致越界，出现段错误。这个是导致输出错误的关键。 但是这样改了之后输出的结果还是8个8，不是我输入的12345678啊[/quote] 你用我改过之后的代码测试的吗？ 我是改了你的代码，并测试的。[/quote] 对啊，就用的你改过的代码，原封不动，输入12345678出来的结果还是88888888，这是怎么回事呀？

user: user-2
content: 引用 4 楼 weixin_37969367 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] #include<stdio.h> #include<stdarg.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 //#define NULL 0 #define    MAX_ARRAY_DIM 8 typedef int ElemType; typedef struct {     ElemType *base;     int dim;     int *bounds;     int *constants; }Array; //构造 int InitArray(Array &A, int dim,...) {     int i;     int elemtotal=1;     va_list ap;     if(dim<1||dim>MAX_ARRAY_DIM)         return ERROR;     A.dim=dim;     A.bounds = (int *)malloc(dim * sizeof(int));     if(!A.bounds) exit (OVERFLOW);     va_start(ap,dim);     for(i=0;i<dim;i++)     {         A.bounds[i]=va_arg(ap,int);         if(A.bounds[i]<0)             return OVERFLOW;         elemtotal *= A.bounds[i];     }     va_end(ap);     A.base=(ElemType *)malloc(elemtotal * sizeof(ElemType));     A.constants=(int *)malloc(dim * sizeof(int));     if(!A.constants) exit (OVERFLOW);     A.constants[dim-1]=1;     for(i=dim-2;i>=0;i--)         A.constants[i]=A.bounds[i+1]*A.constants[i+1];     return OK; } //销毁 int DestroyArray(Array &A) {     if(!A.base) return ERROR;     free(A.base); A.base=NULL;     if(!A.bounds) return ERROR;     free(A.bounds); A.bounds=NULL;     if(!A.constants) return ERROR;     free(A.constants); A.constants=NULL;     return OK; } //定位 int LocateArray(Array A,va_list ap,int &off) {     int ind,i;     //off=0;     for(i=0;i<A.dim;i++)     {         ind=va_arg(ap,int);         if(ind<0||ind>=A.bounds[i])             return OVERFLOW;         off +=A.constants[i] * ind;     }     return OK; } //分配 int AssignArray(Array &A,ElemType e,...) {     va_list ap;     int off = 0,result;    /* Initize the argu: off */     va_start (ap,e);     if((result=LocateArray(A,ap,off))<=0)         return result;     *(A.base+off)=e;     va_end(ap);     return OK; } //显示值 int ValueArray(Array A,ElemType &e,...) {     va_list ap;     int off = 0,result;    /* Initize the argu: off*/     va_start (ap,e);     if((result=LocateArray(A,ap,off))<=0)         return result;     e=*(A.base+off);     va_end(ap);     return OK; } int main() {     Array A;     ElemType e,n;     int i,j,k,a[3];     int dim=3;     printf("请输入各维长度（三维）：\n");     for(i=0;i<3;i++)         scanf("%d",&a[i]);     InitArray(A,dim,a[0],a[1],a[2]);     printf("请输入各元素：\n");     for(i=0; i < a[0];i++)         for(j=0;j<a[1];j++)             for(k=0;k<a[2];k++)             {                 scanf("%d",&e);                 AssignArray(A,e,i,j,k);             }     for(i=0;i<a[0];i++)         for(j=0;j<a[1];j++)             for(k=0;k<a[2];k++)             {                 ValueArray(A,e,i,j,k);                 printf("%d\t",e);             }     return 0; }   两个问题： 1. NULL不用在define，因为stdio.h文件里已经定义，如果重定义建议定义成如下： #define NULL (void*)0 2. 初始化off，代码里有注释，否则随机数会导致越界，出现段错误。这个是导致输出错误的关键。 但是这样改了之后输出的结果还是8个8，不是我输入的12345678啊[/quote] 你用我改过之后的代码测试的吗？ 我是改了你的代码，并测试的。

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:#include<stdio.h> #include<stdarg.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 //#define NULL 0 #define    MAX_ARRAY_DIM 8 typedef int ElemType; typedef struct {     ElemType *base;     int dim;     int *bounds;     int *constants; }Array; //构造 int InitArray(Array &A, int dim,...) {     int i;     int elemtotal=1;     va_list ap;     if(dim<1||dim>MAX_ARRAY_DIM)         return ERROR;     A.dim=dim;     A.bounds = (int *)malloc(dim * sizeof(int));     if(!A.bounds) exit (OVERFLOW);     va_start(ap,dim);     for(i=0;i<dim;i++)     {         A.bounds[i]=va_arg(ap,int);         if(A.bounds[i]<0)             return OVERFLOW;         elemtotal *= A.bounds[i];     }     va_end(ap);     A.base=(ElemType *)malloc(elemtotal * sizeof(ElemType));     A.constants=(int *)malloc(dim * sizeof(int));     if(!A.constants) exit (OVERFLOW);     A.constants[dim-1]=1;     for(i=dim-2;i>=0;i--)         A.constants[i]=A.bounds[i+1]*A.constants[i+1];     return OK; } //销毁 int DestroyArray(Array &A) {     if(!A.base) return ERROR;     free(A.base); A.base=NULL;     if(!A.bounds) return ERROR;     free(A.bounds); A.bounds=NULL;     if(!A.constants) return ERROR;     free(A.constants); A.constants=NULL;     return OK; } //定位 int LocateArray(Array A,va_list ap,int &off) {     int ind,i;     //off=0;     for(i=0;i<A.dim;i++)     {         ind=va_arg(ap,int);         if(ind<0||ind>=A.bounds[i])             return OVERFLOW;         off +=A.constants[i] * ind;     }     return OK; } //分配 int AssignArray(Array &A,ElemType e,...) {     va_list ap;     int off = 0,result;    /* Initize the argu: off */     va_start (ap,e);     if((result=LocateArray(A,ap,off))<=0)         return result;     *(A.base+off)=e;     va_end(ap);     return OK; } //显示值 int ValueArray(Array A,ElemType &e,...) {     va_list ap;     int off = 0,result;    /* Initize the argu: off*/     va_start (ap,e);     if((result=LocateArray(A,ap,off))<=0)         return result;     e=*(A.base+off);     va_end(ap);     return OK; } int main() {     Array A;     ElemType e,n;     int i,j,k,a[3];     int dim=3;     printf("请输入各维长度（三维）：\n");     for(i=0;i<3;i++)         scanf("%d",&a[i]);     InitArray(A,dim,a[0],a[1],a[2]);     printf("请输入各元素：\n");     for(i=0; i < a[0];i++)         for(j=0;j<a[1];j++)             for(k=0;k<a[2];k++)             {                 scanf("%d",&e);                 AssignArray(A,e,i,j,k);             }     for(i=0;i<a[0];i++)         for(j=0;j<a[1];j++)             for(k=0;k<a[2];k++)             {                 ValueArray(A,e,i,j,k);                 printf("%d\t",e);             }     return 0; }   两个问题： 1. NULL不用在define，因为stdio.h文件里已经定义，如果重定义建议定义成如下： #define NULL (void*)0 2. 初始化off，代码里有注释，否则随机数会导致越界，出现段错误。这个是导致输出错误的关键。 但是这样改了之后输出的结果还是8个8，不是我输入的12345678啊

user: user-0
content: 引用 1 楼 jack960330 的回复:请把问题讲明白，这样别人怎么知道出了啥事 就是想让最后输出的结果是我之前输入的各元素值，不是88888888

user: user-2
content: #include<stdio.h> #include<stdarg.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 //#define NULL 0 #define    MAX_ARRAY_DIM 8 typedef int ElemType; typedef struct {     ElemType *base;     int dim;     int *bounds;     int *constants; }Array; //构造 int InitArray(Array &A, int dim,...) {     int i;     int elemtotal=1;     va_list ap;     if(dim<1||dim>MAX_ARRAY_DIM)         return ERROR;     A.dim=dim;     A.bounds = (int *)malloc(dim * sizeof(int));     if(!A.bounds) exit (OVERFLOW);     va_start(ap,dim);     for(i=0;i<dim;i++)     {         A.bounds[i]=va_arg(ap,int);         if(A.bounds[i]<0)             return OVERFLOW;         elemtotal *= A.bounds[i];     }     va_end(ap);     A.base=(ElemType *)malloc(elemtotal * sizeof(ElemType));     A.constants=(int *)malloc(dim * sizeof(int));     if(!A.constants) exit (OVERFLOW);     A.constants[dim-1]=1;     for(i=dim-2;i>=0;i--)         A.constants[i]=A.bounds[i+1]*A.constants[i+1];     return OK; } //销毁 int DestroyArray(Array &A) {     if(!A.base) return ERROR;     free(A.base); A.base=NULL;     if(!A.bounds) return ERROR;     free(A.bounds); A.bounds=NULL;     if(!A.constants) return ERROR;     free(A.constants); A.constants=NULL;     return OK; } //定位 int LocateArray(Array A,va_list ap,int &off) {     int ind,i;     //off=0;     for(i=0;i<A.dim;i++)     {         ind=va_arg(ap,int);         if(ind<0||ind>=A.bounds[i])             return OVERFLOW;         off +=A.constants[i] * ind;     }     return OK; } //分配 int AssignArray(Array &A,ElemType e,...) {     va_list ap;     int off = 0,result;    /* Initize the argu: off */     va_start (ap,e);     if((result=LocateArray(A,ap,off))<=0)         return result;     *(A.base+off)=e;     va_end(ap);     return OK; } //显示值 int ValueArray(Array A,ElemType &e,...) {     va_list ap;     int off = 0,result;    /* Initize the argu: off*/     va_start (ap,e);     if((result=LocateArray(A,ap,off))<=0)         return result;     e=*(A.base+off);     va_end(ap);     return OK; } int main() {     Array A;     ElemType e,n;     int i,j,k,a[3];     int dim=3;     printf("请输入各维长度（三维）：\n");     for(i=0;i<3;i++)         scanf("%d",&a[i]);     InitArray(A,dim,a[0],a[1],a[2]);     printf("请输入各元素：\n");     for(i=0; i < a[0];i++)         for(j=0;j<a[1];j++)             for(k=0;k<a[2];k++)             {                 scanf("%d",&e);                 AssignArray(A,e,i,j,k);             }     for(i=0;i<a[0];i++)         for(j=0;j<a[1];j++)             for(k=0;k<a[2];k++)             {                 ValueArray(A,e,i,j,k);                 printf("%d\t",e);             }     return 0; }   两个问题： 1. NULL不用在define，因为stdio.h文件里已经定义，如果重定义建议定义成如下： #define NULL (void*)0 2. 初始化off，代码里有注释，否则随机数会导致越界，出现段错误。这个是导致输出错误的关键。