저는 C 프로그래밍을 처음 접했고 튜토리얼을 일부 진행할 것입니다. 나를 곤란하게 한 가지는 배열에 대한 포인터를 반환하는 것입니다. 나는 요점을 설명하기 위해 https://www.tutorialspoint.com/cprogramming/c_return_arrays_from_function.htm에서 예제를 잘라 냈다.함수에서 배열 반환하기 (C)
#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
나는 이유를 모르겠다. 필자가 생각할 수있는 유일한 이유는 컴파일러가 배열 셀을 다른 데이터 유형으로 읽는 것이지만 그게 옳은 것인지 의심 스럽습니다.
컴파일러 경고를 읽으십시오 :'임시 참조 반환 '이 좋지 않습니다. 즉, 값은 언제든지 덮어 쓰게됩니다 (따라서 정적 키워드). 이 중복을 찾을 수 없습니다. –
모든 답변 주셔서 감사합니다; 나는 이것을 지금 이해하고 있다고 생각한다. 근본적으로 일단 getRandom 함수를 떠나면 나머지 배열에 사용 된 메모리가 다시 할당되지만 함수 출력에 스택 메모리를 할당하는 'malloc()'을 사용하지 않아도됩니다. – Dant