奇怪,奇怪啊。。。

r11222 2010-03-23 12:08:42
我的一个八皇后程序,用下面的定义,正确输出92摆放方法


static int a[8];
static int b[15];
static int c[15];

换成下面的,只输出了88种。

static int *a=(int *)malloc(8*sizeof(int));
static int* b=(int *)malloc(15*sizeof(int));
static int *c=(int *)malloc(15*sizeof(int));


我很不解,这两种定义不是完全相同吗??

楼下贴程序
...全文
110 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
r11222 2010-03-23
  • 打赏
  • 举报
回复
你们还没有解决我的问题啊。。。。。

问题是,两种不同的定义为什么结果不一样?????
yuzl32 2010-03-23
  • 打赏
  • 举报
回复
static int b[15];这种方式会自动初始化为零
static int* b=(int *)malloc(15*sizeof(int)); 要手动初始化15个

void initabc()
{
memset(a,0,8*sizeof(int));
memset(b,0,(15)*sizeof(int));
memset(c,0,(15)*sizeof(int));
}
chaoliu1024 2010-03-23
  • 打赏
  • 举报
回复
也许static不能修饰malloc
AlanBruce 2010-03-23
  • 打赏
  • 举报
回复

/*static int a[8];//
static int b[15];
static int c[15];
*/
static int *a=(int *)malloc(8*sizeof(int));// 这两种内存申请方式不是一回事,static修饰的不 //是你所想要的
static int* b=(int *)malloc(15*sizeof(int));
static int *c=(int *)malloc(15*sizeof(int));

AlanBruce 2010-03-23
  • 打赏
  • 举报
回复
你把指针声明为静态类型有什么意义吗??
xiuxianshen 2010-03-23
  • 打赏
  • 举报
回复

static int a[8];
static int b[15];
static int c[15];

void initabc()
{
memset(a,0,8*sizeof(int));
memset(b,0,(14)*sizeof(int));
memset(c,0,(14)*sizeof(int));
}

r11222 2010-03-23
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include<malloc.h>
#include<memory.h>
static int C=0;

void printf_array(int *arr,int M,int N)
{
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
printf("%d ",arr[N*j+i]);
}
printf("\n");
}
printf("\n");
printf("第%d个\n",++C);

}

void init_array( int *arr,int M,int N)
{
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
arr[j*N+i]=0;
}

}}
/*static int a[8];// 就是这里改一改,改成这种就正确了,求解答
static int b[15];
static int c[15];
*/
static int *a=(int *)malloc(8*sizeof(int));// 这种只输出88种可能,正确是有92种的
static int* b=(int *)malloc(15*sizeof(int));
static int *c=(int *)malloc(15*sizeof(int));

void initabc()
{
memset(a,0,8*sizeof(int));
memset(b,0,(14)*sizeof(int));
memset(c,0,(14)*sizeof(int));
}

void put_queen(int *arr,int M, int N,int j ,int HavePut )
{

for(int i=0;i<N;i++)
{
if(a[i]==0&&b[i+j]==0&&c[N-1-i+j]==0)
{
arr[j*N+i]=3;
a[i]=1;
b[i+j]=1;
c[N-1-i+j]=1;
if(j<7)
put_queen(arr, M, N , j+1,HavePut+1);
else
{
printf_array(arr,M,N);
}

arr[j*N+i]=0;
a[ i]=0;
b[i+ j]=0;
c[N-1- i+ j]=0;

}
}
}


int main(int argc, char* argv[])
{

int arr[8*8];

init_array( arr,8,8);
initabc();
put_queen(arr,8,8,0 ,0 );
return 0;

}
赵4老师 2010-03-23
  • 打赏
  • 举报
回复
改用calloc好些。
bobo364 2010-03-23
  • 打赏
  • 举报
回复
static int* b=(int *)malloc(15*sizeof(int));
这里得到的是一个指针,指向了null,所以要自己定义
而下面的写法,可以说是初始化了一个结构体,但又不是结构体,系统为你做了定义和分配内存
bobo364 2010-03-23
  • 打赏
  • 举报
回复
static int* b=(int *)malloc(15*sizeof(int)); 要手动初始化15个。

这返回的是一个指针,但指向的值是null,所以要自己初始化15个

上面可以说是写好的一个结构体,所以按照定义要求定义出来的就分配了内存,初始化了元素
r11222 2010-03-23
  • 打赏
  • 举报
回复
另外问一问,我这两种申请数组的方式在本质上有什么区别。底层内存方面的。。谢谢
yuzl32 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 r11222 的回复:]
你们还没有解决我的问题啊。。。。。

问题是,两种不同的定义为什么结果不一样?????
[/Quote]
static int b[15];这种方式会自动初始化为零
static int* b=(int *)malloc(15*sizeof(int)); 要手动初始化15个。

你用static int b[15];定义的话,根本不需要initabc函数也可以正确输出,你试试。
r11222 2010-03-23
  • 打赏
  • 举报
回复
oh no。。。。发现了。。。memset 个数错了。。。谢谢大家

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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