将char缓冲区传递给函数并获取缓冲区的大小
我已将缓冲区设置为100.我在声明缓冲区的main函数中显示缓冲区。 但是,当我将缓冲区传递给函数并获得sizeof’4’时,我认为它应该是100,因为这是我在main中创建的缓冲区的大小。 输出:缓冲区大小:100 sizeof(缓冲区):4
#include #include 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[N]
,编译器也会自动将其更改为char *name
。
如果要强制调用者仅传递大小为100的数组,则可以接受数组的地址(及其类型):
void load_buffer(char (*buffer)[100]) { /* prints 100 */ printf("sizeof(buffer): %d\n", sizeof(*buffer)); }
它是指向main中的数组的指针,因此您需要在函数中取消引用以获取数组。 然后索引完成
buffer[0][N] or (*buffer)[N]
我所知道的任何人都没有这样做,而且我自己也没有这样做,因为它使论证的传递变得相当复杂。 但了解它是件好事。 你可以这样调用这个函数
load_buffer(&buffer)
如果你也想接受其他尺码,我会选择其他两个答案推荐的传球-N选项。
来自OP
void load_buffer(char *buffer) { printf("sizeof(buffer): %d\n", sizeof(buffer)); }
即使你可以想象load_buffer()
通过load_buffer()
传递buffer
,但实际上你正在通过值传递一个指向char
的指针。 实际数组未传递,因此load_buffer()
函数无法知道缓冲区数组的大小
那么sizeof(buffer)
在做什么呢? 它只是返回指向char的指针的大小。 如果load_buffer()
需要buffer
的大小,则需要准确地传递它。
或者你可以创建一个包含char数组和数组大小的新结构,并将指针传递给该结构,这样缓冲区和它的大小总是在一起;)
会发生什么,当您将数组传递给函数时,您只传递内存中数组的地址,而不是数组的大小。 load_buffer()中输出的sizeof(缓冲区)是指针的大小,即四个字节。
保持函数中缓冲区大小的最佳方法是将函数更改为:
void load_buffer(char *buffer, int length);
并呼吁:
load_buffer(buffer, sizeof(buffer));
然后在需要缓冲区大小时使用长度。