C의 함수에서 배열 반환
C의 경우 함수에서 배열을 반환하면 오류가 발생할 수 있습니다. 특히 다음과 같은 경우에는 더욱 그렇습니다. 배열은 스택에 할당됩니다.
다음 코드를 고려하세요.
<code class="cpp">#include <iostream> using namespace std; int* uni(int *a, int *b) { int c[10]; int i = 0; while (a[i] != -1) { c[i] = a[i]; i++; } for (; i < 10; i++) c[i] = b[i - 5]; return c; } int main() { int a[10] = {1, 3, 3, 8, 4, -1, -1, -1, -1, -1}; int b[5] = {1, 3, 4, 3, 0}; int *c = uni(a, b); for (int i = 0; i < 10; i++) cout << c[i] << " "; cout << "\n"; return 0; }</code>
이 코드에서 uni() 함수는 배열 c를 생성하고 배열 a에서 음수가 아닌 숫자를 병합합니다. 그리고 b를 c로 바꾸세요. 그러나 코드가 c를 반환하려고 하면 배열이 범위를 벗어나서 가비지 값이 반환됩니다.
이 문제를 방지하려면 일반적으로 배열을 함수에 대한 포인터로 전달하고 포인터를 반환하는 것이 좋습니다. . 그러나 포인터를 사용하는 것은 번거로울 수 있으며 어떤 경우에는 다른 접근 방식을 사용하는 것이 더 나을 수 있습니다.
한 가지 대안은 구조체나 클래스를 사용하여 배열을 캡슐화하고 값으로 객체를 반환하는 것입니다. 다음 수정된 코드를 고려하십시오.
<code class="cpp">#include <iostream> using namespace std; struct myArray { int array[10]; }; myArray uni(int *a, int *b) { myArray c; int i = 0; while (a[i] != -1) { c.array[i] = a[i]; i++; } for (; i < 10; i++) c.array[i] = b[i - 5]; return c; } int main() { int a[10] = {1, 3, 3, 8, 4, -1, -1, -1, -1, -1}; int b[5] = {1, 3, 4, 3, 0}; myArray c = uni(a, b); for (int i = 0; i < 10; i++) cout << c.array[i] << " "; cout << "\n"; return 0; }</code>
이 예에서 uni() 함수는 myArray 구조체의 인스턴스를 반환합니다. 구조체는 값으로 반환되고 내부 배열이 복사되므로 함수가 반환된 후에도 값이 유효한지 확인됩니다.
위 내용은 C의 함수에서 배열을 안전하게 반환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!