Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么C++;到期且可以';是否无法访问数组的所有元素?_C++_Arrays_Function Pointers - Fatal编程技术网

C++ 为什么C++;到期且可以';是否无法访问数组的所有元素?

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]<&

当我在下面编译时,只有第一个“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]<<"\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。一直以来,我都认为,:-*但这不是吗