int* create()
{
int* a = new int[8];
int b[8] = { 1, 2, 3, 5, 2, 3, 5, 6 };
memcpy(a, b, sizeof(b));
int i;
for (i = 0; i < 8; i++)
{
printf("%hd\n", a[i]);
}
return a;//返回得到的整型数组的指针。
}
int main()
{
int i;
int* b;
b = create();
for (i = 0; i < 8; i++)
{
printf("%hd\n", b[i]);
}
delete b;
system("pause");
}
#include <stdio.h>
#include<stdlib.h>
int *create()
{
static int a[8] = { 1, 2, 3, 5, 2, 3, 5, 6 };
int i;
for (i = 0; i < 8; i++)
{
printf("%hd\n", a[i]);
}
return a;//返回得到的整型数组的指针。
}
int main()
{
int i;
int *b;
b = create();
for (i = 0; i < 8; i++)
{
printf("%hd\n", b[i]);
}
system("pause");
return 0;
}
返回局部变量的指针, 程序行为是未定义的.
数组 a 在 create 函数返回后内存已被回收, 可能用于存放其他的数据了.
。。。为什么我认为这程序就不该被编译成功,本身就是错误的返回类型
对于数组:
&a 等价于 a, 等价于 &a[0], 都能表示数组的地址, 是可以转换成指针的. 而且在函数传参数的时候数组都会自动退化成指针的.
返回局部变量的指针, 程序行为是未定义的.
数组 a 在 create 函数返回后内存已被回收, 可能用于存放其他的数据了.
。。。为什么我认为这程序就不该被编译成功,本身就是错误的返回类型
对于数组:
&a 等价于 a, 等价于 &a[0], 都能表示数组的地址, 是可以转换成指针的. 而且在函数传参数的时候数组都会自动退化成指针的.
返回局部变量的指针, 程序行为是未定义的.
数组 a 在 create 函数返回后内存已被回收, 可能用于存放其他的数据了.
。。。为什么我认为这程序就不该被编译成功,本身就是错误的返回类型
对于数组:
&a 等价于 a, 等价于 &a[0], 都能表示数组的地址, 是可以转换成指针的. 而且在函数传参数的时候数组都会自动退化成指针的.
但是事实上编译器会对这个返回进行报错,因为返回类型和函数类型不同
当然。 a 等价于 &a[0] 这个我是支持的 ,但是我不认为 &a 可以和 a 等价,
不是吧,如果&a 等价于 &a[0], 那如果数组a 的元素是int *, 那 *a 和 *a[0]岂不是也一样?二维数组和一维数组不是混乱了?
不考虑栈的问题,函数定义的是返回int *, 而函数实现返回的是int **,没有强制转换编译起码是个警告
但是事实上编译器会对这个返回进行报错,因为返回类型和函数类型不同
你用的什么编译器会报错?
试试把你的文件扩展名改成 .c, 而不是 .cpp . 用 C 语言的编译器来编译, 不是用 C++ 的编译器来编译. 毕竟这里是 C 语言区, 讨论的是 C 语言.
当然。 a 等价于 &a[0] 这个我是支持的 ,但是我不认为 &a 可以和 a 等价,
你可以打印 printf("%p", a) 和 printf("%p", &a) 来看他们的值是否是一样的就知道了. 一个数组只对应内存中一块连续的内存, 无论是 a, 还是 &a 都是这块内存的首地址, 没有多余的内存, 也就没有多余的内存地址的.
不是吧,如果&a 等价于 &a[0], 那如果数组a 的元素是int *, 那 *a 和 *a[0]岂不是也一样?二维数组和一维数组不是混乱了?
在 C 语言里面, 二维数组本身就和一位数组没什么区别, 也只是一块连续的内存而已, 把二维数组转换成 int*p 后, 二维数组都可以按照一维数组的方式访问: p[y * width + x], 二维数组的 a[x][y] 访问方式不过是一个语法糖而已.
不考虑栈的问题,函数定义的是返回int *, 而函数实现返回的是int **,没有强制转换编译起码是个警告
把返回类型认为是 int** 就错的有点离谱了.
注意数组 a 直接表示了一块内存, 而不是 a 定义了一个指针, 这个指针来指向一块内存, 注意这个区别:
建议看一下 C专家编程 这本书,
http://blog.adintr.com/43
返回局部变量的指针, 程序行为是未定义的.
数组 a 在 create 函数返回后内存已被回收, 可能用于存放其他的数据了.
那这个应该怎么解决呢,网上好多都是这么写的
声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创建数组名,它的值时一个常量,指向这段空间的起始位置。
数组名是符号地址常量,在编译时求值并存在编译器的符号表里面,其值就是个内存地址;所以可以认为程序没有给a分配空间,数组名只是代表了那个数组空间;与指针不一样,指针指向一块空间,同时指针本身也存储在某个空间;可以认为数组名存在在符号表里,符号表是编译器用的,我们管不到;a和&a值是一样的,本来对常量取地址是非法的,但是标准组织没有定对数组名取地址是非法还是合法,所以因编译器而异,VC是合法的。
返回局部变量的指针, 程序行为是未定义的.
数组 a 在 create 函数返回后内存已被回收, 可能用于存放其他的数据了.
。。。为什么我认为这程序就不该被编译成功,本身就是错误的返回类型