c - 为什么在函数调用中找不到指针数组的大小?

标签 c arrays function pointers sizeof

<分区>

为什么这个功能有效

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

void print_array(char **array, size_t size)
{
    for (int i = 0; i < size; i++) {
        printf("%s\n",array[i]);
    }
}

int main()
{

    char *base_data[] = {
        "sample 1",
        "sample 2",
        "sample 3"
    };


    print_array(base_data,sizeof(base_data)/sizeof(char*));

    return 0;
}

但是这段代码没有

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

void print_array(char **array)
{
    for (int i = 0; i < sizeof(array)/sizeof(char*); i++) {
        printf("%s\n",array[i]);
    }
}

int main()
{

    char *base_data[] = {
        "sample 1",
        "sample 2",
        "sample 3"
    };


    print_array(base_data);

    return 0;
}

程序在打印第一个值后崩溃。无论我尝试什么,我都无法在函数调用中找到指向字符串的指针数组的大小。大多数 stackoverflow 示例还将数组的大小传递给函数。将字符串指针数组传递给函数时会发生什么情况?

最佳答案

在第一个程序中的表达式

sizeof(base_data)

给出声明的数组的大小

char *base_data[] = {
    "sample 1",
    "sample 2",
    "sample 3"
};

在第二个程序中的表达式

sizeof(array)

给出指针的大小,因为根据函数声明,array 是一个指针

void print_array(char **array);

即使你会像这样声明函数

void print_array(char *array[3]);

尽管如此,编译器将声明调整为声明

void print_array(char **array);

所以上面两个声明是等价的,都声明了同一个函数,只有一个指针类型的参数。在函数中,您正在处理一个指针。

另一方面,传递给函数的数组被隐式转换为指向其第一个元素的指针。

例如,您可以使用等于 NULL 的标记值

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

void print_array(char **array)
{
    while ( *array ) puts( *array++ );
}

int main( void )
{

    char *base_data[] = {
        "sample 1",
        "sample 2",
        "sample 3",
        NULL
    };


    print_array(base_data);
}

或者你需要像这样显式传递数组的大小

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

void print_array( char **array, size_t n )
{
    for ( size_t i = 0; i < n; i++ ) puts( array[i] );
}

int main( void )
{

    char *base_data[] = {
        "sample 1",
        "sample 2",
        "sample 3",
    };


    print_array(base_data, sizeof( base_data ) / sizeof( *base_data ) );
}

附言第二个程序不应该崩溃。它只输出表达式 array[i] 指向的一个元素。只需在函数中检查表达式 sizeof(array)/sizeof(char*) 的值

printf( "%zu", sizeof(array)/sizeof(char*) );

关于c - 为什么在函数调用中找不到指针数组的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56858106/

相关文章:

javascript - 空json输出导致的错误 "Object.keys called on non-object"

php - 如何删除数组中的重复项

python - Python 中的函数定义需要很多时间

javascript - 我到目前为止还没有见过这种 JavaScript 语法,它到底有什么作用?

c - 在函数 C 内分配 void 指针

c - 为什么这个函数返回 0 而不是 double?

sql - 我怎样才能发送超过 32,767 字节的数据?

javascript - JSON 到对象数组格式

function - 管道获取内容到自己的功能

C虚拟操作