char 버퍼를 함수로 전달하고 버퍼의 크기를 얻습니다.
문제
버퍼를 크기 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));
그런 다음 버퍼의 크기를 원할 때마다 길이를 사용하십시오.