C++ 为什么C++;到期且可以';是否无法访问数组的所有元素?
当我在下面编译时,只有第一个“cout”正确工作C++ 为什么C++;到期且可以';是否无法访问数组的所有元素?,c++,arrays,function-pointers,C++,Arrays,Function Pointers,当我在下面编译时,只有第一个“cout”正确工作 void * functionname() { int i[3]={1,2,3}; int *p = i; return p; } int main() { int *p = new int[3]; p= (int *)functionname(); std::cout<<p[1]<<"\n"; std::cout<<p[1]<<"\n"; std::cout<<p[2]<&
void * functionname()
{
int i[3]={1,2,3};
int *p = i;
return p;
}
int main()
{
int *p = new int[3];
p= (int *)functionname();
std::cout<<p[1]<<"\n";
std::cout<<p[1]<<"\n";
std::cout<<p[2]<<"\n";
std::cout<<p[2]<<"\n";
std::cout<<p[3]<<"\n";
std::cout<<p[3]<<"\n";
delete [] p;
return 0;
}
void*functionname()
{
int i[3]={1,2,3};
int*p=i;
返回p;
}
int main()
{
int*p=新的int[3];
p=(int*)函数名();
std::cout数组i
是函数的本地数组。当函数返回时,它将消失,留下一个悬空指针。最好返回一个std::array
std::array<int, 3> functionname()
{
return std::array<int, 3>{{1,2,3}};
}
std::数组函数名()
{
返回std::数组{{1,2,3};
}
这样,调用者就可以得到数组的一个副本,而且没有问题。在您开始担心复制的成本之前,请注意,通常编译器会删除副本,因此只创建一个数组
如果需要访问底层数据块,可以使用theArray.data()
或&theArray[0]
。这将为您提供指向第一个元素的指针
注意1:如果没有C++11支持,可以从
标题使用std::tr1::array
。如果没有,请查看boost::array
,或者推出自己的数组类
注意2:如果您想要一个只在运行时知道大小的数组,请改用std::vector
。数组i
是函数的本地数组。当函数返回时,它将消失,留下一个悬空的指针。最好返回std::array
std::array<int, 3> functionname()
{
return std::array<int, 3>{{1,2,3}};
}
std::数组函数名()
{
返回std::数组{{1,2,3};
}
这样,调用者就可以得到数组的一个副本,而且没有问题。在您开始担心复制的成本之前,请注意,通常编译器会删除副本,因此只创建一个数组
如果需要访问底层数据块,可以使用theArray.data()
或&theArray[0]
。这将为您提供指向第一个元素的指针
注意1:如果没有C++11支持,可以从
标题使用std::tr1::array
。如果没有,请查看boost::array
,或者推出自己的数组类
注意2:如果您想要一个只在运行时知道大小的数组,请使用std::vector
。将其更改为
void * functionname() {
int *i = new int[3];
i[0] = 1;
i[1] = 2;
i[2] = 3;
return i;
}
如果数组要存在于函数末尾之后,则必须将其放在堆上而不是堆栈上
正如@juanchopanza和@Servé所指出的,为了实现正确的内存管理,请确保在完成后处理此文件
int *a = (int *)functionname();
//do something with a
delete[] a;
换成
void * functionname() {
int *i = new int[3];
i[0] = 1;
i[1] = 2;
i[2] = 3;
return i;
}
如果数组要存在于函数末尾之后,则必须将其放在堆上而不是堆栈上
正如@juanchopanza和@Servé所指出的,为了实现正确的内存管理,请确保在完成后处理此文件
int *a = (int *)functionname();
//do something with a
delete[] a;
返回指向在函数退出时被销毁的临时对象的指针
这将有助于:
void * functionname()
{
static int i[3]={1,2,3};
int *p = i;
return p;
}
注意这里的“static”。返回指向在函数退出时被销毁的临时对象的指针
这将有助于:
void * functionname()
{
static int i[3]={1,2,3};
int *p = i;
return p;
}
请注意此处的“静态”。下面您找到了一个将本地数组移到外部的版本。此版本与您现有的版本非常接近。您将指针传递给要填充到functionname
的字段。您负责将复制的数组放入可用空间
但是,现在最好使用像std::vector
这样的对象来处理这样的东西。新的移动构造函数(c++11)将使它更加高效
还请注意,您的索引访问错误。C++数组的索引从0开始,而不是从1开始
#include <iostream>
void functionname(int* p)
{
int i[3]={1,2,3};
std::copy(i,i+sizeof(i)/sizeof(i[0]),p);
}
int main()
{
int *p = new int[3];
functionname(p);
std::cout<<p[0]<<"\n";
std::cout<<p[1]<<"\n";
std::cout<<p[2]<<"\n";
delete [] p;
return 0;
}
#包括
无效函数名(int*p)
{
int i[3]={1,2,3};
std::copy(i,i+sizeof(i)/sizeof(i[0]),p);
}
int main()
{
int*p=新的int[3];
功能名称(p);
std::cout在下面,您可以找到一个将本地数组放到外部的版本。此版本与您现有的版本非常接近。您可以将一个指针传递给要填充到functionname
的字段。您负责将复制的数组放入可用空间
但是,现在最好使用像std::vector
这样的对象来处理这样的东西。新的移动构造函数(c++11)将使它更加高效
还请注意,您的索引访问错误。C++数组的索引从0开始,而不是从1开始
#include <iostream>
void functionname(int* p)
{
int i[3]={1,2,3};
std::copy(i,i+sizeof(i)/sizeof(i[0]),p);
}
int main()
{
int *p = new int[3];
functionname(p);
std::cout<<p[0]<<"\n";
std::cout<<p[1]<<"\n";
std::cout<<p[2]<<"\n";
delete [] p;
return 0;
}
#包括
无效函数名(int*p)
{
int i[3]={1,2,3};
std::copy(i,i+sizeof(i)/sizeof(i[0]),p);
}
int main()
{
int*p=新的int[3];
功能名称(p);
std::coutThank you,问题是我想将此函数用作一个线程函数,并且只接受void*。我该怎么办?@user2982229我会使用一个现代线程库,它不需要void*
。如果不能,您可以获取数组的数据,请参阅我的编辑。使用theArray.data()
无法解决问题。如果您尝试返回该指针,则会删除std::array
,并删除指针指向的内存。@Paul Draper显然不是要返回指针。而是要返回数组,如前所述。“问题”问题中没有指定函数本身。谢谢,问题是我想将此函数用作线程函数,并且只能接受void*。我该怎么办?@user2982229我会使用一个现代线程库,它不需要void*
。如果不能,您可以获取数组的数据,请参阅我的编辑。使用theArray.data()
无法解决问题。如果您尝试返回该指针,则会删除std::array
,并删除指针指向的内存。@Paul Draper显然不是要返回指针。而是要返回数组,如前所述。“问题”问题中未指定其本身。但这不是使i
全局吗?(即多次调用functionname
可能会导致意外行为)谢谢,回答@Paul Draper was grate,我不想使用static。一直以来,我都认为,:-*但这不是吗