【发布时间】:2019-12-16 08:02:05
【问题描述】:
我尝试了返回数组指针以更好地了解它们的工作原理,并发现了一些我无法解释的东西。
为什么当我在实际返回之前遍历返回数组时,以下代码会起作用(请参阅条件部分)?
是不是因为 C 很懒,实际上并没有将数组写入内存,因为它认为无论如何它永远不会被访问?
#include <stdio.h>
//returns pointer to array terminated by (-1)
int* thisDoesntMakeAnySense(int randomNumber) {
int array[randomNumber + 1];
for(int i = 0; i < randomNumber; i++) {
array[i] = i;
}
array[randomNumber] = -1;
#ifdef ENABLE_CLUDGE
int i = 0;
while(array[i] != -1) {
printf("%d\n", array[i]);
i++;
}
#endif
return array;
}
int main() {
int* test = thisDoesntMakeAnySense(3);
while(*test != -1) {
printf("%d\n", *test);
test++;
}
return 0;
}
【问题讨论】:
-
是不是因为 C 是惰性的,实际上并没有将数组写入内存 不是,是因为数组有本地作用域,当你退出函数时,他的生命周期结束,到使其可见:1) 使用动态内存
int *array = malloc((randomNumber + 1) * sizeof *array);或 2) 使其成为static:static int array[randomNumber + 1]; -
"为什么下面的代码可以工作" --> 你期望什么行为?
标签: c pointers undefined-behavior local-variables