C++中内存的动态分配
Dynamic Allocation of Memory in 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);
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::string
或std::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
必须返回int
。void 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函数参数。希望这对你有帮助。
相关文章:
- 删除类成员的动态分配内存的最佳方法是什么
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 为浮点数组动态分配内存
- 包含动态分配内存作为值的映射的取消定位速度有多快?
- STD分配器是否会在堆上动态分配内存?它可以安全地删除内存吗?
- 如何为const char double指针(使用新的)动态分配内存
- 在动态分配内存的同时,使用指定尺寸
- 动态分配内存
- 如何在我指向的安德烈斯上动态分配内存?
- 为什么C 没有方便的方式来为多维数组动态分配内存
- 当动态分配内存时警告
- 为结构动态分配内存
- 动态分配内存,用于存储使用 WinHttpReadData 下载的 HTML 源代码
- 如何在C++中为灵活阵列动态分配内存
- 从C++中的文件读取时动态分配内存到结构
- 在c++中的赋值运算符重载方法中删除旧的动态分配内存
- 在类方法中使用新运算符动态分配内存的寿命和范围是多少
- 以C++为单位的动态分配内存的初始值
- 虚拟析构函数:如果基类动态分配内存,基类中是否需要它
- 如何在 c++ 中使用 2-D 固定数组为 4-D 数组动态分配内存