我正试图在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
有人可以帮忙吗?谢谢
答案 0 :(得分:1)
首先,请注意您的问题与C ++几乎没有关系。据我所知,它完全是C语言。在C ++中,您可以使用new
代替malloc
来处理低级别内存业务的罕见场合,以及std::string
或{ {1}}更高级别。
不过,让我们看看这里有什么问题。
最明显的问题是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));
有完全相同的错误。正确的电话应该是:
citireM
最后,scanf_s("%f", ( *(a + i) + j ) );
必须返回main
。 int
在C或C ++中不合法。
那应该解决它。
答案 1 :(得分:0)
正确的代码应该是:
#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函数参数。希望这会对你有所帮助。