程序编译通过运行错误,请教高手

时间:2021-02-14 15:59:28
代码如下:
#include <iostream>   
#include <iomanip>
#include <string>
#include <cmath>
using namespace std;   

int main()
{
int N;
int s, i, j;
int squa;
scanf("%d",&N);
int **a = (int **)malloc(N*sizeof(int));
if(a == NULL)
return 0;
for(i = 0; i<N; i++);
{
if((a[i] = (int *)malloc(N*sizeof(int))) == NULL)
{
while(--i >= 0)
free(a[i]);
free(a);
return 0;
}
}
squa = N*N;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
s = i+j;
if(s<N)
a[i][j] = s*(s+1)/2+(((i+j)%2 == 0)? i:j);
else
{
s = (N-1-i) + (N-1-j);
a[i][j] = squa - s*(s+1)/2 - (N-(((i+j)%2==0)?i:j));
}
}
for(i = 0; i<N; i++)
{
for(j = 0; j < N; j++)
printf("%6d",a[i][j]);
printf("\n");
}
return 0;
}

出现的错误如下:
main.exe 中的 0x00401194 处未处理的异常: 0xC0000005: 写入位置 0xcdcdcdcd 时发生访问冲突
请教高手是怎么回事?

7 个解决方案

#1


这行最后面多了个分号,结果后面给a[i]分配空间的代码是从i=N开始执行的
    for(i = 0; i<N; i++) ;

#2


引用楼主 likee003 的回复:
出现的错误如下:
main.exe 中的 0x00401194 处未处理的异常: 0xC0000005: 写入位置 0xcdcdcdcd 时发生访问冲突
请教高手是怎么回事?

出现这种错误多半是指针未能正确初始化。
在 Debug 模式下, 
VC 会把未初始化的栈内存全部填成 0xcc,当字符串看就是 烫烫烫烫…… 
会把未初始化的堆内存全部填成 0xcd,当字符串看就是 屯屯屯屯…… 
可以让我们方便地看出那些内存没初始化 

#3


我在学C++,要少看这种混杂代码
1&2楼貌似很久没出现了,呵呵

#4


这里也有点问题:int **a = (int **)malloc(N*sizeof(int));
应该是int **a = (int **)malloc(N*sizeof( int *));
通常int和int*的大小一样,所以不影响运行的结果,但是从概念上是错误的。而且,如果是char和char*那就要出问题了。

main结束之前最好把a[i]和a都free掉。

既然写的是c++代码,最好用cin/cout代替scanf/printf,用new/delete代替malloc/free

#5


引用 3 楼 starcat 的回复:
我在学C++,要少看这种混杂代码
1&2楼貌似很久没出现了,呵呵

3楼好久不见,有这么多裤衩了
现在没多少时间,以潜水为主

#6


引用 4 楼 *mill 的回复:
通常int和int*的大小一样,所以不影响运行的结果

这个不准确。一般的32位系统int和int*的大小一样,但是现在是64位时代了。
很多64位系统的int是4字节,而int*是8字节。

#7


for(i = 0; i<N; i++);  //去掉分号

#1


这行最后面多了个分号,结果后面给a[i]分配空间的代码是从i=N开始执行的
    for(i = 0; i<N; i++) ;

#2


引用楼主 likee003 的回复:
出现的错误如下:
main.exe 中的 0x00401194 处未处理的异常: 0xC0000005: 写入位置 0xcdcdcdcd 时发生访问冲突
请教高手是怎么回事?

出现这种错误多半是指针未能正确初始化。
在 Debug 模式下, 
VC 会把未初始化的栈内存全部填成 0xcc,当字符串看就是 烫烫烫烫…… 
会把未初始化的堆内存全部填成 0xcd,当字符串看就是 屯屯屯屯…… 
可以让我们方便地看出那些内存没初始化 

#3


我在学C++,要少看这种混杂代码
1&2楼貌似很久没出现了,呵呵

#4


这里也有点问题:int **a = (int **)malloc(N*sizeof(int));
应该是int **a = (int **)malloc(N*sizeof( int *));
通常int和int*的大小一样,所以不影响运行的结果,但是从概念上是错误的。而且,如果是char和char*那就要出问题了。

main结束之前最好把a[i]和a都free掉。

既然写的是c++代码,最好用cin/cout代替scanf/printf,用new/delete代替malloc/free

#5


引用 3 楼 starcat 的回复:
我在学C++,要少看这种混杂代码
1&2楼貌似很久没出现了,呵呵

3楼好久不见,有这么多裤衩了
现在没多少时间,以潜水为主

#6


引用 4 楼 *mill 的回复:
通常int和int*的大小一样,所以不影响运行的结果

这个不准确。一般的32位系统int和int*的大小一样,但是现在是64位时代了。
很多64位系统的int是4字节,而int*是8字节。

#7


for(i = 0; i<N; i++);  //去掉分号

相关文章