c语言高手帮忙下,看看下面这个程序哪里出错

我编译的时候没有错误,但运行的时候出现“0x0040116e”指令引用的“0x00000004”内存。该内存不能为read对话框,这该怎么改啊#include<stdio... 我编译的时候没有错误,但运行的时候出现“0x0040116e”指令引用的“0x00000004”内存。该内存不能为read对话框,这该怎么改啊
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int *Triplet;
typedef int ElemType;
Status InitTriplet(Triplet T,ElemType v1,ElemType v2,ElemType v3)
{
T=(int *)malloc(3*sizeof(int));
if(!T)
exit(OVERFLOW);
T[0]=v1;
T[1]=v2;
T[2]=v3;
return OK;
}
Status Get(Triplet T,ElemType i,ElemType e)
{
if(i<1||i>3)
return ERROR;
e=T[i-1];
return e;
}
Status Put(Triplet T,ElemType i,ElemType e)
{
if(i<1||i>3)
return ERROR;
T[i-1]=e;
return T[i-1];
}
void IsAscending(Triplet T)
{
if(T[0]<=T[1]&&T[1]<=T[2])
printf("是升序!\n");
else
printf("不是升序!\n");
}
void IsDescending(Triplet T)
{
if(T[0]>=T[1]&&T[1]>=T[2])
printf("是降序!\n");
else
printf("不是降序!\n");
}
Status Max(Triplet T,ElemType e)
{
e=(T[0]>=T[1])?((T[0]>=T[2])?T[0]:T[2]):((T[1]>=T[2])?T[1]:T[2]);
return e;
}
Status Min(Triplet T,ElemType e)
{
e=(T[0]<=T[1])?((T[0]<=T[2])?T[0]:T[2]):((T[1]<=T[2])?T[1]:T[2]);
return e;
}
void main()
{
ElemType v1,v2,v3,i,e1,e2,e3,e4;

Triplet T=NULL;

e1=e3=e4=0;

printf("请输入v1,v2,v3的值:\n");

scanf("%d %d %d",&v1,&v2,&v3);

printf("请输入i,e2的值:\n");

scanf("%d %d",&i,&e2);

InitTriplet(T,v1,v2,v3);
printf("a\n");

printf("T的第i元的值是:%d\n",Get(T,i,e1));

printf("T的第i元的值被换为e2:%d\n",Put(T,i,e2));

IsAscending(T);

IsDescending(T);

printf("T的最大元素的值是:%d\n",Max(T,e3));

printf("T的最小元素的值是:%d\n",Min(T,e4));
}
展开
 我来答
百度网友c36097ebc
2009-02-25 · TA获得超过255个赞
知道小有建树答主
回答量:218
采纳率:0%
帮助的人:255万
展开全部
先看看我改后的运行可以对不对。。比较下两者有什么区别。
其实就是将你第一个函数的原型
Status InitTriplet(Triplet T,ElemType v1,ElemType v2,ElemType v3)
改为
Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3);

其它的地方都不需要动一个字,你自己试试吧。。。

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int *Triplet;
typedef int ElemType;

//主要看看这个程序,第一个参数我改成了引用,而你之前的只是一个普通的参数,即使你在后面T=(int *)malloc(3*sizeof(int)); 但想想,它只是一个形参,你主程序中的T并没有被复制,自然出现了错误,其实就是这个一个小小的地方。
Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3)
{
T=(int *)malloc(3*sizeof(int));
if(!T)
exit(OVERFLOW);
T[0]=v1;
T[1]=v2;
T[2]=v3;
return OK;
}
Status Get(Triplet T,ElemType i,ElemType e)
{
if(i<1||i>3)
return ERROR;
e=T[i-1];
return e;
}
Status Put(Triplet T,ElemType i,ElemType e)
{
if(i<1||i>3)
return ERROR;
T[i-1]=e;
return T[i-1];
}
void IsAscending(Triplet T)
{
if(T[0]<=T[1]&&T[1]<=T[2])
printf("是升序!\n");
else
printf("不是升序!\n");
}
void IsDescending(Triplet T)
{
if(T[0]>=T[1]&&T[1]>=T[2])
printf("是降序!\n");
else
printf("不是降序!\n");
}
Status Max(Triplet T,ElemType e)
{
e=(T[0]>=T[1])?((T[0]>=T[2])?T[0]:T[2]):((T[1]>=T[2])?T[1]:T[2]);
return e;
}
Status Min(Triplet T,ElemType e)
{
e=(T[0]<=T[1])?((T[0]<=T[2])?T[0]:T[2]):((T[1]<=T[2])?T[1]:T[2]);
return e;
}
int main()
{
ElemType v1,v2,v3,i,e1,e2,e3,e4;

Triplet T=NULL;

e1=e3=e4=0;

printf("请输入v1,v2,v3的值:\n");

scanf("%d %d %d",&v1,&v2,&v3);

printf("请输入i,e2的值:\n");

scanf("%d %d",&i,&e2);

InitTriplet(T,v1,v2,v3);
printf("a\n");

printf("T的第i元的值是:%d\n",Get(T,i,e1));

printf("T的第i元的值被换为e2:%d\n",Put(T,i,e2));

IsAscending(T);

IsDescending(T);

printf("T的最大元素的值是:%d\n",Max(T,e3));

printf("T的最小元素的值是:%d\n",Min(T,e4));
system("PAUSE");
return 0;
}
3death3
2009-02-25 · 超过14用户采纳过TA的回答
知道答主
回答量:69
采纳率:0%
帮助的人:0
展开全部
貌似用malloc分配内存以后,是不能更改内容的,就是说赋值以后不能改变了,只能重新分配,再赋值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式