为什么这个功能有效
#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*) );