我对C编程非常陌生,正在学习一些教程。有一件事让我感到困惑,那就是返回一个指向数组的指针。为了更好地说明我的观点,我减少了function.htm中的示例。
#include <stdio.h>
int * getRandom( ) {
static int r[10];
int i;
for ( i = 0; i < 10; ++i) {
r[i] = i;
printf( "r[%d] = %d\n", i, r[i]);
}
return r;
}
int main () {
int *p;
int i;
p = getRandom();
for ( i = 0; i < 10; i++ ) {
printf( "*(p + %d) : %d\n", i, *(p + i));
}
return 0;
}正如人们所预料到的,这些指纹
r[0] = 0
r[1] = 1
r[2] = 2
r[3] = 3
r[4] = 4
r[5] = 5
r[6] = 6
r[7] = 7
r[8] = 8
r[9] = 9
*(p + 0) : 0
*(p + 1) : 1
*(p + 2) : 2
*(p + 3) : 3
*(p + 4) : 4
*(p + 5) : 5
*(p + 6) : 6
*(p + 7) : 7
*(p + 8) : 8
*(p + 9) : 9但当你改变
static int r[10];至
int r[10];而是打印
r[0] = 0
r[1] = 1
r[2] = 2
r[3] = 3
r[4] = 4
r[5] = 5
r[6] = 6
r[7] = 7
r[8] = 8
r[9] = 9
*(p + 0) : 0
*(p + 1) : 1980517315
*(p + 2) : -1164399724
*(p + 3) : 4199040
*(p + 4) : 4199040
*(p + 5) : 2285568
*(p + 6) : 19
*(p + 7) : 6356668
*(p + 8) : 8
*(p + 9) : 6356940我也不知道为什么。我唯一能想到的是,由于某种原因,编译器将数组单元格读取为不同的数据类型,但我怀疑这是正确的。
发布于 2016-10-16 22:40:28
static关键字用于“记住”下一次调用中r的值。如果删除它,则在函数返回时会刷新分配给r的内存,因此您只是返回垃圾。
发布于 2016-10-16 22:40:29
当您拥有static int r[10];时,用于存储数组的内存将在编译时分配,并且一切都按预期工作。
当您拥有int r[10]时,您将在运行时堆栈框架上分配数组,当函数调用返回时,该数组将变得无效,然后被下一个函数调用覆盖,因此您会看到垃圾。
发布于 2016-10-16 22:49:35
原因是当您调用getRandom()而没有静态数组声明时,一旦getRandom()函数返回,该数组就会超出范围。这意味着您的指针可能不再“指向”r,因为r基本上被丢弃。
为了正确地从getRandom()返回,您需要使用malloc动态分配内存,例如:
int * getRandom( ) {
int *r = NULL;
r = malloc(sizeof(int) * 10); /* Create room for 10 integers*/
if (r == NULL) {
printf("Error: Could not allocate space\n");
return NULL;
}
int i;
for ( i = 0; i < 10; ++i) {
r[i] = i;
printf( "r[%d] = %d\n", i, r[i]);
}
return r; /* Returns a pointer to r*/
}
int main () {
int *p;
int i;
p = getRandom();
if (p == NULL) {
/*Error state*/
return 1;
}
for ( i = 0; i < 10; i++ ) {
printf( "*(p + %d) : %d\n", i, *(p + i));
}
free(p); /* Free the memory we allocated*/
return 0;
}注意我们必须如何free我们分配的内存(否则就会有内存泄漏)。还要注意,我们必须处理NULL情况,在这种情况下,我们无法分配所需的内存。
https://stackoverflow.com/questions/40076239
复制相似问题