所以,我想创建一个让用户“声明”一个数组的函数,比如int_array(a,3);
,这就是我的函数代码:
int int_array(int *p, int n)
{
*p = (int*)malloc(n*sizeof(int));
return *p;
}
问题是,我收到以下错误:
从'int *'无效转换为'int'。
我不知道为什么。实际上导致此错误的是什么?是因为'n'是一个简单的整数而不是指针吗?
答案 0 :(得分:1)
问题是你的函数是取消引用一个没有指向有效int*
的{{1}}指针,然后你试图将一个新分配的int
数组分配给被解除引用的int
。即使分配了int
,也无法指定指向非指针变量的指针,这是您得到的错误。
请改为尝试:
int
int* int_array(int n)
{
return (int*) malloc(n * sizeof(int));
}
但是,您不应该在C ++中使用int *a = int_array(3);
...
free(a);
,而是使用malloc()
:
new[]
int* int_array(int n)
{
return new int[n];
}
更好的选择是改为使用int *a = int_array(3);
...
delete[] a;
:
std::unique_ptr
std::unique_ptr<int[]> int_array(int n)
{
return std::make_unique<int[]>(n);
}
或者,只需删除此功能并改为使用std::unique_ptr<int[]> a = int_array(3);
...
:
std::vector
答案 1 :(得分:0)
问题:*p = (int*)malloc(n*sizeof(int));
,
*p
是int
,您尝试为其分配int *
。这不起作用(至少不是你试图这样做的方式)。
以下是修复:
int int_array(int *p, int n)
{
p = (int*)malloc(n * sizeof(int));
return *p;
}
但是,我担心这会导致内存泄漏,因为你在数组中分配的指针永远不会被释放。
解决方案是返回一个指针,或者更好(因为这应该是C ++),返回一个智能指针。
std::unique_ptr<int[]> int_array(std::unique_ptr<int[]> &p, int n)
{
p = std::unique_ptr<int[]>(new int[n]);
return p
}
为什么甚至打扰传递指针?只是做:
std::unique_ptr<int[]> int_array(int n)
{
return std::unique_ptr<int[]>(new int[n]);
}