C++中内存的动态分配

Dynamic Allocation of Memory in C++

本文关键字:动态分配 内存 C++      更新时间:2023-10-16

我试图在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++中,对于处理低级别内存业务的罕见情况,您将使用new而不是malloc,而对于更高级别,则使用std::stringstd::vector之类的类。

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

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

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

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

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

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

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

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

最后,main必须返回intvoid main在C或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);
    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函数参数。希望这对你有帮助。