各位大神帮帮忙啊

鬼火儿 2012-11-10 01:37:19
#include<stdio.h>
# include<malloc.h>
int deal(int n);
void main()
{
int n,r;
int i,j;

printf("请输入数组的维数(维数应大于3且应为奇数):");
scanf("%d",&n);
fflush(stdin);
while(n<3||n%2==0)
{
printf("输入错误,请重新输入(维数应大于3且应为奇数):");
scanf("%d",&n);
fflush(stdin);
}
deal(n);
getch();
}
int deal(int n)
{
int i,j,no,num,max;
int *mtrx;
max=n*n;
mtrx = malloc(max+max);
mtrx[n/2]=1;
i=0;
j=n/2;
for(num=2;num<=max;num++)
{
i=i-1;
j=j+1;
if((num-1)%n==0)
{
i=i+2;
j=j-1;
}
if(i<0)
{
i=n-1;
}
if(j>n-1)
{
j=0;
}
no =i*n+j;
mtrx[no]=num;
}
printf("The charming matrix is:");
no=0;
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<n;j++)
{
printf("%3d",mtrx[no]);
no++;
}
}
free(mtrx);
}

能运行出来但是会出现以下结果为什么啊
...全文
113 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
彭家老三 2012-11-12
  • 打赏
  • 举报
回复
引用 7 楼 bangke1991 的回复:
引用 5 楼 pengjialaosan 的回复:平时用的是new和delete,不太熟悉malloc和free的用法,刚刚看了一下,可能是这一句申请内存的时候有问题: mtrx = malloc(max+max); 感觉应该改成下面这句,我改过之后,就没有出现中断了, mtrx = (int*)malloc( sizeof(int) * (max+max) )……
你看6楼不是给你解释了吗?你要使用的内存空间应该是sizeof(int) * (max+max)这么大,但你申请的是max+max,所以就出问题了。 malloc和new申请内存后面跟的数字意义是不一样的,new可以自动识别变量类型,例如int *a = new int[5];指的是申请一个可以装5个int型变量的空间,其实际大小应该是5*sizeof(int)。而malloc参数数字是多大,空间就是多大,所以你需要申请(max+max)个int型空间,就得传递sizeof(int) * (max+max)这么大的参数。
鬼火儿 2012-11-11
  • 打赏
  • 举报
回复
引用 5 楼 pengjialaosan 的回复:
平时用的是new和delete,不太熟悉malloc和free的用法,刚刚看了一下,可能是这一句申请内存的时候有问题: mtrx = malloc(max+max); 感觉应该改成下面这句,我改过之后,就没有出现中断了, mtrx = (int*)malloc( sizeof(int) * (max+max) );
请问这个怎么解释啊!
JiMoKuangXiangQu 2012-11-10
  • 打赏
  • 举报
回复
deal()函数中访问的空间超过了分配的大小,应该在分配的时候乘以sizeof(int).
#include <stdio.h>
#include <malloc.h>

int deal(int n);

void  main()
{
	int n/* = 7*/,r;
	int i,j;

	printf("请输入数组的维数(维数应大于3且应为奇数):");
	scanf("%d",&n);
	fflush(stdin);
	while(n<3||n%2==0)
	{
		printf("输入错误,请重新输入(维数应大于3且应为奇数):");
		scanf("%d",&n);
		fflush(stdin);
	}
	deal(n);
	getch();
}

int deal(int n)
{
	int i,j,no,num,max;
	int *mtrx;
	max=n*n;
	mtrx = malloc((max+max) * sizeof(int));
	mtrx[n/2]=1;
	i=0;
	j=n/2;
	for(num=2;num<=max;num++)
	{
		i=i-1;
		j=j+1;
		if((num-1)%n==0)
		{
			i=i+2;
			j=j-1;
		}
		if(i<0)
		{
			i=n-1;
		}
		if(j>n-1)
		{
			j=0;
		}
		no =i*n+j;
		mtrx[no]=num;
	}
	printf("The charming matrix is:");
	no=0;
	for(i=0;i<n;i++)
	{
		printf("\n");
		for(j=0;j<n;j++)
		{
			printf("%3d",mtrx[no]);
			no++;
		}
	}
	free(mtrx);
}
彭家老三 2012-11-10
  • 打赏
  • 举报
回复
平时用的是new和delete,不太熟悉malloc和free的用法,刚刚看了一下,可能是这一句申请内存的时候有问题: mtrx = malloc(max+max); 感觉应该改成下面这句,我改过之后,就没有出现中断了, mtrx = (int*)malloc( sizeof(int) * (max+max) );
newtee 2012-11-10
  • 打赏
  • 举报
回复
把代码编辑好重新贴下吧! 太乱没人想看
鬼火儿 2012-11-10
  • 打赏
  • 举报
回复
引用 2 楼 zhuankeshumo 的回复:
贴下 你这程序想干嘛? C/C++ code1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162#include<stdio.h># include<malloc.h>int deal(i……
这个是打印魔方,我自己编了一个是不用传参的,但是是固定的5*5的,书上给的答案是可以传参的
newtee 2012-11-10
  • 打赏
  • 举报
回复
贴下 你这程序想干嘛?
#include<stdio.h>
# include<malloc.h>
int  deal(int n);
void  main()
 {
int n,r;
int i,j;

printf("请输入数组的维数(维数应大于3且应为奇数):");
scanf("%d",&n);
fflush(stdin);
while(n<3||n%2==0)
{
printf("输入错误,请重新输入(维数应大于3且应为奇数):");
scanf("%d",&n);
fflush(stdin);
}
deal(n);
getch();
 }
int deal(int n)
 {
 int i,j,no,num,max;
 int *mtrx;
 max=n*n;
mtrx = malloc(max+max);
 mtrx[n/2]=1;
 i=0;
 j=n/2;
 for(num=2;num<=max;num++)
 {
 i=i-1;
 j=j+1;
 if((num-1)%n==0)
 {
i=i+2;
j=j-1;
 }
 if(i<0)
 {
i=n-1;
 }
 if(j>n-1)
 {
 j=0;
 }
 no =i*n+j;
 mtrx[no]=num;
 }
printf("The charming matrix is:");
no=0;
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<n;j++)
{
printf("%3d",mtrx[no]);
no++;
}
}
free(mtrx);
 }
彭家老三 2012-11-10
  • 打赏
  • 举报
回复
楼主,先把你的代码贴好,另外,你的deal函数没有返回值。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧