【问题标题】:Why the size of array of pointers cannot be found inside function call? [duplicate]为什么在函数调用中找不到指针数组的大小? [复制]
【发布时间】:2019-11-13 10:25:48
【问题描述】:

为什么这个函数有效

#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 示例还将数组的大小传递给函数。将字符串指针数组传递给函数时会发生什么情况?

【问题讨论】:

  • 数组传入函数时会衰减为指针。
  • char **array 声明一个指针,而不是一个数组。该变量名为array,,但这并不重要。
  • sizeof(array) 始终是代码中指针的大小,因此等于 sizeof(char*)
  • 您所拥有的只是一个(一维)指向字符的指针数组。同样的逻辑也适用。

标签: c arrays function pointers sizeof


【解决方案1】:

在第一个程序中的表达式

sizeof(base_data)

给出声明为like的数组的大小

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

【讨论】:

  • 所以没有办法将数组传递给函数并计算该函数内部数组的大小?
  • @A.Munir 查看我更新的帖子。
  • 为什么while(*array) 返回true?如果内存未启动,是否会填充空值?
  • @A.Munir 如果内存没有被初始化,它是否填充了空值:如果内存没有被初始化,它被填充的是 undefined ;但是如果你传递一个指向一个初始化数组的指针,while ( *array ) 将是真的,直到*array 计算为null——也就是说,直到相应的数组元素被初始化为@ 987654336@
  • @A.Munir : ... 另请注意,有时内存会自动初始化,但我的其他评论仍然有效,无论是谁/什么在进行初始化
猜你喜欢
  • 2017-06-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 2011-09-17
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多