将char缓冲区传递给函数并获取缓冲区的大小

时间:2009-03-04 04:49:33

标签: c arrays function char

我已将缓冲区设置为100。 我在声明缓冲区的main函数中显示缓冲区。 但是,当我将缓冲区传递给函数并获得sizeof'4'时, 我以为它应该是100,因为那是我的缓冲区的大小 在主要创建。     输出:     缓冲区大小:100     sizeof(缓冲区):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 个答案:

答案 0 :(得分:21)

您正在使用指向缓冲区的指针大小(4个字节),而不是缓冲区的大小。

在C中,你必须分别传递缓冲区的大小,这是缓冲区溢出发生的原因的一部分,这很容易和频繁。

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

答案 1 :(得分:21)

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));
}

它是指向main中的数组的指针,因此您需要在函数中取消引用以获取数组。然后索引由

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

我认识的任何人都没有这样做,我自己也没有这样做,因为它使论证的传递变得相当复杂。但了解它是件好事。您可以像这样调用函数

load_buffer(&buffer)

如果你也想接受其他尺码,我会选择其他两个答案推荐的传球-N选项。

答案 2 :(得分:8)

来自OP

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

即使您可以想象load_buffer()通过引用传递buffer,但实际发生的是您通过值传递指向char的指针。实际数组未传递,因此load_buffer()函数无法知道缓冲区数组的大小

那么sizeof(buffer)在做什么?它只是返回指向char的指针的大小。如果load_buffer()需要buffer的大小,则需要合理地传递。

或者您可以创建一个包含char数组和数组大小的新结构,并将指针传递给该结构,这样缓冲区和它的大小总是在一起;)

答案 3 :(得分:4)

会发生什么,当您将数组传递给函数时,您只传递内存中数组的地址,而不是数组的大小。 load_buffer()中输出的sizeof(缓冲区)是指针的大小,即4个字节。

保持函数中缓冲区大小的最佳方法是将函数更改为:

void load_buffer(char *buffer, int length);

和致电:

load_buffer(buffer, sizeof(buffer));

然后在需要缓冲区大小时使用长度。