>  기사  >  백엔드 개발  >  C의 함수에서 배열을 안전하게 반환하는 방법은 무엇입니까?

C의 함수에서 배열을 안전하게 반환하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-30 08:16:02158검색

How do you safely return an array from a function in C  ?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.