문제

버퍼를 크기 100으로 설정했습니다. 버퍼가 선언 된 주 기능에 버퍼를 표시합니다. 그러나 버퍼를 함수로 전달하고 '4'크기를 얻을 때 메인에서 만든 버퍼의 크기이기 때문에 100이어야한다고 생각했습니다. 출력 : 버퍼 크기 : 100 크기 (버퍼) : 4

#include <string.h>
#include <stdio.h>

void load_buffer(char *buffer);

int main()
{
    char buffer[100];
    printf("buffer size: %d\n", sizeof(buffer));
    load_buffer(buffer);

    return 0;
}

void load_buffer(char *buffer)
{
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}
도움이 되었습니까?

해결책

버퍼의 크기가 아닌 버퍼 (4 바이트)에 대한 포인터의 크기를 사용하고 있습니다.

C에서는 버퍼의 크기를 별도로 전달해야합니다. 이는 버퍼 오버런이 너무 쉽고 자주 발생하는 이유 중 일부입니다.

void load_buffer(char * buffer, size_t bufSize)
{    
    ...
}

다른 팁

Mitch Wheat와 Hhafez의 답변은 완전히 옳고 요점입니다. 때때로 유용 할 수있는 몇 가지 추가 정보를 보여 드리겠습니다.

컴파일러에 올바른 크기의 배열이 있다고 말하면 동일하게 발생합니다.

void load_buffer(char buffer[100]) {
    /* prints 4 too! */
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}

매개 변수로서 배열은 포인터를 선언합니다. 컴파일러는 자동으로이를 변경합니다 char *name 그것이 선언 된 경우에도 char name[N].

발신자가 크기 100 배열 만 전달하도록 강요하려면 배열의 주소 (및 그 유형)를 대신 받아 들일 수 있습니다.

void load_buffer(char (*buffer)[100]) {
    /* prints 100 */
    printf("sizeof(buffer): %d\n", sizeof(*buffer));
}

메인에있는 배열에 대한 포인터이므로 배열을 얻으려면 함수의 회의가 필요합니다. 그런 다음 인덱싱이 수행됩니다

buffer[0][N] or (*buffer)[N]

내가 아는 사람은 아무도 그렇게하고 있으며, 논쟁의 전달을 복잡하게하기 때문에 스스로하고 있습니다. 그러나 그것에 대해 아는 것이 좋습니다. 그런 다음 기능을 호출 할 수 있습니다

load_buffer(&buffer)

다른 크기도 받아들이려면 다른 두 가지 대답이 권장하는 Passing-N 옵션으로 이동합니다.

OP에서

void load_buffer(char *buffer)
{
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}

당신은 그것을 상상할 수 있지만 load_buffer() 전달됩니다 buffer Retrence로, 실제로 일어나고있는 것은 당신이 포인터를 전달하고 있다는 것입니다. char ~에 의해 값. 실제 배열은 전달되지 않으므로 load_buffer() 기능 버퍼 배열의 크기를 알 수 있습니다

그래서 무엇입니까 sizeof(buffer) 행위? 그것은 단순히 포인터의 크기를 숯으로 반환하는 것입니다. 만약에 load_buffer() 크기가 필요합니다 buffer 그것은 대단히 통과해야합니다.

또는 숯 배열과 배열의 크기를 모두 포함하는 새 구조물을 만들고 대신 해당 구조물에 포인터를 전달할 수 있습니다. 버퍼와 크기는 항상 함께 있습니다.)

일어나는 일은 배열을 함수로 전달할 때 배열의 크기가 아니라 메모리의 배열 주소 만 전달합니다. load_buffer ()에서 출력하는 크기 (버퍼)는 포인터의 크기이며, 이는 4 바이트입니다.

기능에서 버퍼의 크기를 유지하는 가장 좋은 방법은 기능을 다음과 같이 변경하는 것입니다.

void load_buffer(char *buffer, int length);

그리고 다음에 대한 호출 :

load_buffer(buffer, sizeof(buffer));

그런 다음 버퍼의 크기를 원할 때마다 길이를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top