当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《将char缓冲区传递给函数并获取缓冲区的大小》经验,为你挑选了3个好方法。

我已将缓冲区设置为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));
}

Mitch Wheat.. 22

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

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

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


Johannes Sch.. 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选项.



1> Mitch Wheat..:

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

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

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



2> Johannes Sch..:

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选项.



3> hhafez..:

来自OP

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

即使你能想象那load_buffer()是通过buffer由refrence,究竟发生什么事是你传递一个指针char值.实际数组未传递,因此load_buffer()函数无法知道缓冲区数组的大小

那是sizeof(buffer)做什么的?它只是返回指向char的指针的大小.如果load_buffer()需要它的大小buffer需要合理地通过.

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

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有