#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int *getRandom(void);
int main(int argc, char* argv[])
{
int *p;
p = getRandom();
for(int i = 0; i < 10; i ++)
{
printf("*(p + %d) = %d\n", i, *(p + i));
}
return 0;
}
int *getRandom(void)
{
int r[10];
srand((unsigned)time(NULL));
for(int i;i < 10; i++)
{
r[i] = rand();
printf("r[%d] = %d\n", i, r[i]);
}
return r;
}
lanfeiy@yelanfei ~/workspace/test
$ make -f c.mk
gcc -o pointerReturn pointerReturn.c -g -Wall
pointerReturn.c: In function ‘getRandom’:
pointerReturn.c:38:12: warning: function returns address of local variable [-Wreturn-local-addr]
38 | return r;
| ^
lanfeiy@yelanfei ~/workspace/test
$ ./pointerReturn.exe
r[1] = 296257045
r[2] = 1976444455
r[3] = 1818576789
r[4] = 755853447
r[5] = 1048925215
r[6] = 2019396098
r[7] = 1255202355
r[8] = 434117987
r[9] = 622347876
Segmentation fault (core dumped)
lanfeiy@yelanfei ~/workspace/test
$ cat pointerReturn.exe.stackdump
Exception: STATUS_ACCESS_VIOLATION at rip=001004010BA
rax=0000000000000000 rbx=000000018023E7A0 rcx=0000000800000010
rdx=0000000000000000 rsi=0000000000000000 rdi=0000000000000000
r8 =00000000FFFFC914 r9 =0000000000000000 r10=0000000100000000
r11=0000000100401132 r12=00000000FFFFCC90 r13=00000000FFFFCDF0
r14=0000000000000000 r15=0000000000000000
rbp=00000000FFFFCC40 rsp=00000000FFFFCC10
program=D:\softwareTools\DesTools\Cygwin64\home\lanfeiy\workspace\test\pointerReturn.exe, pid 1149, thread main
cs=0033 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame Function Args
000FFFFCC40 001004010BA (000FFFFCC90, 00180048D30, 00000000000, 00180335BA0)
000FFFFCCE0 00180049EFD (00000000000, 00000000000, 00000000000, 00000000000)
000FFFFFFF0 00180047856 (00000000000, 00000000000, 00000000000, 00000000000)
000FFFFFFF0 00180047904 (00000000000, 00000000000, 00000000000, 00000000000)
End of stack trace
int *getRandom(void)
{
static int r[10];
srand((unsigned)time(NULL));
for(int i;i < 10; i++)
{
r[i] = rand();
printf("r[%d] = %d\n", i, r[i]);
}
return r;
}
lanfeiy@yelanfei ~/workspace/test
$ make -f c.mk
gcc -o pointerReturn pointerReturn.c -g -Wall
lanfeiy@yelanfei ~/workspace/test
$ ./pointerReturn.exe
r[1] = 533630443
r[2] = 261920408
r[3] = 1113003961
r[4] = 648006629
r[5] = 2060791236
r[6] = 641596662
r[7] = 972510164
r[8] = 1290130542
r[9] = 1687481754
*(p + 0) = 0
*(p + 1) = 533630443
*(p + 2) = 261920408
*(p + 3) = 1113003961
*(p + 4) = 648006629
*(p + 5) = 2060791236
*(p + 6) = 641596662
*(p + 7) = 972510164
*(p + 8) = 1290130542
*(p + 9) = 1687481754
(1)int r[10]的作用域在getRandom函数里,出了getRandom函数就被回收了。你返回这个r是没有用的。
static int r[10]是静态变量,跟全局变量的效果一样,所以不会再崩溃。可以看一下下面这篇文章的相关说明。
static变量及其作用,C语言static变量详解 在 C 语言中,static 关键字不仅可以用来修饰变量,还可以用来修饰函数。在使用 static 关键字修饰变量时,我们称此变量为 静态变量 。 静态变量的存储方式与全局变量一样,都是静态 http://c.biancheng.net/view/301.html
(2)getRandom函数中for循环的变量i没有初始化,有的编译器在处理的时候会默认赋值为0,有的编译器可能给的是一个随机值,所以这么用是有风险的,如果是随机值,一个问题是可能导致数组越界(如负数或者大于10的数),一个问题是可能导致r数组赋值不完全。
题主的问题出在这里吧:
int i; i 没有赋初值,改为:for(int i=0;i<10;i++) 。还有就是在函数里定义的数组空间,当函数运行结束时,数组空间是会释放的,所以函数里 return r; 没有作用的。