【问题标题】:Dynamic Allocation of Memory in C++C++中内存的动态分配
【发布时间】:2015-02-28 15:03:19
【问题描述】:

我正在尝试在 c++ 中找出动态分配,但遇到了问题。

#include <stdio.h>
#include <malloc.h>

float *alocareV(int n)
{
    float *v;
    v = (float *)malloc(n*sizeof(float));
    return v;
}

float **alocareM(int m, int p)
{
    float **a;
    int i;
    a = (float **)malloc(m*sizeof(float));
    for (i = 0; i < m; i++)
        *(a + i) = (float *)malloc(p*sizeof(float));
    return a;
}

void dezalocareM(float **a ,int p)
{
    int i;
    for (i = 0; i < p; i++)
        free (*(a + i));
}

void citireV(float *v, int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("v[%d]= ", i);
        scanf_s("%f", *(v + i));
    }
}

void citireM(float **a, int m, int p)
{
    int i, j;
    for (i = 0; i < m;i++)
    for (j = 0; j < p; j++)
    {
        printf("a[%d][%d]= ", i, j);
        scanf_s("%f", *( *(a + i) + j ) );
    }
}

void main()
{
    float *v=0, **a=0;
    int n, m, p;
    int i, j;

    printf("n este egal cu ");
    scanf_s("%d", &n);
    printf("m este egal cu ");
    scanf_s("%d", &m);
    printf("p este egal cu ");
    scanf_s("%d", &p);

    alocareV(n);
    alocareM(m, p);

    citireV(v, n);
    citireM(a, m, p);

    free(v);
    dezalocareM(a, p);

}

首先,我必须在 main 中初始化 *v=0 和 **a=0,因为我收到一条错误消息,告诉我“使用了未初始化的局部变量”。如果我不使用子程序,则不会出现该错误。 其次,在输入 3 个变量(n、m、p)后,我得到了一个停止工作的框,问题是:

Problem signature:
  Problem Event Name:   APPCRASH
  Application Name: AlocareDinamica.exe
  Application Version:  0.0.0.0
  Application Timestamp:    54f1d7f9
  Fault Module Name:    AlocareDinamica.exe
  Fault Module Version: 0.0.0.0
  Fault Module Timestamp:   54f1d7f9
  Exception Code:   c0000005
  Exception Offset: 00014059
  OS Version:   6.3.9600.2.0.0.768.100
  Locale ID:    1033
  Additional Information 1: 5861
  Additional Information 2: 5861822e1919d7c014bbb064c64908b2
  Additional Information 3: a10f
  Additional Information 4: a10ff7d2bb2516fdc753f9c34fc3b069

有人可以帮忙吗?谢谢

【问题讨论】:

  • 这看起来更像 c 而不是 c++。在 c++ 中,我们有 dynamic memory managementcontainer classes
  • a = (float **)malloc(m*sizeof(float)); 你使用的是sizeof(float),而你应该使用sizeof(float*)
  • 还有内存泄漏,因为dezalocareM 没有释放浮点指针数组。而且您在 dezalocareM 中分配了错误数量的浮点数组,因为当您应该循环到 m 时,您正在循环到 p

标签: c++ memory dynamic allocation


【解决方案1】:

首先,请注意您的问题与 C++ 无关。据我所知,它完全是C。在 C++ 中,您将使用 new 而不是 malloc 用于处理低级内存业务的罕见 场合,而像 std::stringstd::vector 这样的类用于更高级别。

不过,让我们看看这里出了什么问题。

最明显的问题是alocareV 中发生的事情与citireV 中发生的事情之间没有联系,alocareM/citireM 中发生的事情也是如此。您的分配函数的结果被丢弃。您必须使用结果:

v = alocareV(n);
a = alocareM(m, p);

alocareM 也有错误。为双指针分配内存时,应该使用sizeof(float*),而不是sizeof(float)

下一个错误在citireVscanf_s 要求您将指针传递给要写入的对象。但是,*(v + i) 会产生 float,而不是 float*,因为您取消了对指针的引用。正确的调用是:

scanf_s("%f", (v + i));

citireM 有完全相同的错误。正确的调用应该是:

scanf_s("%f", ( *(a + i) + j ) );

最后,main 必须返回 intvoid main 在 C 或 C++ 中是不合法的。

这应该可以解决它。

【讨论】:

  • “在 C++ 中,你会使用 new” 我强烈反对。请参阅我对 c++ 中应该使用什么的问题的评论。
  • @πάνταῥεῖ:智能指针不会取代 all 用于原始指针的用途。无论如何,它们是根据new 实现的。我认为它们是更高级别的类,例如 std::vectorstd::string。我认为对于来自 Java 或类似语言的 C++ 初学者来说,最重要的是了解他们可以在堆栈上创建任何对象,甚至不需要到处动态分配内存。
  • @πάνταῥεῖ:反正我是在明确谈论“罕见的场合”! :)
【解决方案2】:

正确的代码应该是:

#include <stdio.h>
#include <malloc.h>

float *alocareV(int n)
{
    float *v;
    v = (float *)malloc(n*sizeof(float));
    return v;
}

float **alocareM(int m, int p)
{
    float **a;
    int i;
    a = (float **)malloc(m*sizeof(float *));
    for (i = 0; i < m; i++)
        *(a + i) = (float *)malloc(p*sizeof(float));
    return a;
}

void dezalocareM(float **a ,int p)
{
    int i;
    for (i = 0; i < p; i++)
        free (*(a + i));
}

void citireV(float *v, int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("v[%d]= ", i);
        scanf_s("%f", (v + i));
    }
}

void citireM(float **a, int m, int p)
{
    int i, j;
    for (i = 0; i < m;i++)
    for (j = 0; j < p; j++)
    {
        printf("a[%d][%d]= ", i, j);
        scanf_s("%f", ( *(a + i) + j ) );
    }
}

void main()
{
    float *v=0, **a=0;
    int n, m, p;
    int i, j;

    printf("n este egal cu ");
    scanf_s("%d", &n);
    printf("m este egal cu ");
    scanf_s("%d", &m);
    printf("p este egal cu ");
    scanf_s("%d", &p);

    v = alocareV(n);
    a = alocareM(m, p);

    citireV(v, n);
    citireM(a, m, p);

    free(v);
    dezalocareM(a, p);

}

改变

alocareV(n);
alocareM(m, p);

在主函数中:

v = alocareV(n);
a = alocareM(m, p);

还修改了 scanf_s 函数参数。希望这会对你有所帮助。

【讨论】:

  • 你应该解释一下。特别指出你改变了什么。
  • @πάνταῥεῖ:他的代码有错误。我刚刚改正了。
  • 你的版本还是有错误。
  • @zenith:什么错误?
  • a = (float **)malloc(m*sizeof(float)); 应该使用sizeof(float*)
猜你喜欢
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 2015-06-27
  • 2021-02-28
  • 2012-01-20
相关资源
最近更新 更多