标题:动态内存分配
只看楼主
zhaojun222
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2018-7-9
结帖率:66.67%
已结贴  问题点数:13 回复次数:3 
动态内存分配
// oj专用.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>

int main()
{
    int M, N, i, j, m, n, sum = 0, **a;
    printf("input two number:");
    scanf_s("%d %d", &M, &N);
    a = (int**)malloc(M * sizeof(int*));//????????
    *a = (int*)malloc(N * sizeof(int));//??????????
    for (i = 0; i < M; i++)
        for (j = 0; j < N; j++)
            scanf_s("%d", &a[i][j]);
    printf("input two number:");
    scanf_s("%d %d", &m, &n);
    for (i = 0; i < M; i++)
        for (j = 0; j < N; j++)
            sum = sum + a[i][j];
    printf("%d", sum);
}
上面注释的两行,我用动态内存分配创建二维数组,为什么最后不能运行?
下面是运行结果:
“oj专用.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。
“oj专用.exe”(Win32): 已加载“C:\Windows\SysWOW64\kernel32.dll”。无法查找或打开 PDB 文件。
“oj专用.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。
“oj专用.exe”(Win32): 已加载“C:\Windows\SysWOW64\vcruntime140d.dll”。无法查找或打开 PDB 文件。
“oj专用.exe”(Win32): 已加载“C:\Windows\SysWOW64\ucrtbased.dll”。无法查找或打开 PDB 文件。
线程 0x2d6c 已退出,返回值为 0 (0x0)。
0x5AA1939E (ucrtbased.dll)处(位于 oj专用.exe 中)引发的异常: 0xC0000005: 写入位置 0xCDCDCDCD 时发生访问冲突。

程序“[1096] oj专用.exe”已退出,返回值为 0 (0x0)。
搜索更多相关主题的帖子: 文件 int exe dll 查找 
2019-01-15 17:51
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:1 
#include "pch.h"
#include <iostream>

int main()
{
    int M, N, i, j, m, n, sum = 0, *a;//  **a是一个二级指针,不能与二维数组等同
    printf("input two number:");
    scanf_s("%d %d", &M, &N);
    //a = (int**)malloc(M * sizeof(int*));//????????
   // *a = (int*)malloc(N * sizeof(int));//??????????
   // 前两句只分配了M+N个内存空间,然而你是要M*N个,克扣了不少
   a = (int*)malloc(M * N * sizeof(int));
    for (i = 0; i < M; i++)
        for (j = 0; j < N; j++)
           // scanf_s("%d", &a[i][j]);二级指针,不能直接用二维数组操作符,因为你没有告诉他二维的长度
        scanf_s("%d", a+i*N+j);//自己算吧
    //printf("input two number:");
    //scanf_s("%d %d", &m, &n);没看出m,n有啥用

    for (i = 0; i < M; i++)
        for (j = 0; j < N; j++)
            //sum = sum + a[i][j];
            sum = sum + *(a+i*N+j);
    printf("%d", sum);
}
2019-01-15 19:27
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
得分:1 
应该是编译器问题吧,网上有解决方法。

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2019-01-17 16:36
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:11 
你只给a[0] 赋值了
a[1]到a[M - 1] 都是野指针

https://zh.
2019-01-18 00:06



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-492699-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.197711 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved