gcc 4.4.4 c89
然而,我在尝试展示所有动物时遇到了问题。
我有以下代码。
我正在尝试显示阵列中的所有动物。所以我有三个指向char *的指针数组。然后是指向这些数据集的指针数组。
我试图控制内部循环以检查外部的-1和NULL。
void initialize_char_array()
{
char *data_set1[] = {"dog", "cat", "bee", NULL};
char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL};
char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL};
char *ptr_char[] = {*data_set1, *data_set2, *data_set3, NULL};
display_char_array(ptr_char);
}
void display_char_array(char **ptr_char)
{
size_t inner = 0, outer = 0;
for(outer = 0; ptr_char[outer] != NULL; outer++) {
for(inner = 0; *ptr_char[inner] != -1; inner++) {
printf("data [ %s ]\n", ptr_char[outer][inner]);
}
}
}
非常感谢任何建议,
答案 0 :(得分:5)
*data_set1
与data_set1[0]
相同。
这是您尝试做的固定版本。恕我直言,你使用的味道问题:
循环中的索引变量或指针迭代器,显然编译器将生成完全相同的机器代码。
// type of ptr_char changed
void display_char_array(char **ptr_char[])
{
size_t inner = 0, outer = 0;
for(outer = 0; ptr_char[outer] != NULL; outer++) {
// check for NULL in inner loop!
for(inner = 0; ptr_char[outer][inner] != NULL; inner++) {
printf("data [ %s ]\n", ptr_char[outer][inner]);
}
}
}
void initialize_char_array()
{
char *data_set1[] = {"dog", "cat", "bee", NULL};
char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL};
char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL};
// fixed
char **ptr_char[] = {data_set1, data_set2, data_set3, NULL};
display_char_array(ptr_char);
}
答案 1 :(得分:3)
考虑到initialize_char_array
函数初始化ptr_char
数组的方式,您永远无法显示所有动物。您只能显示三个列表中的第一个列表。如果您希望能够访问所有动物,则应首先将ptr_char
定义为指向char指针的指针数组:char **ptr_char[]
。
然后显示函数应该使用此类型char ***
的参数作为参数。是的,这是间接的3个级别。然后,不要使用size_t
变量在数组中循环,使用char **
变量和char *
。
答案 2 :(得分:2)
查看每个数组的类型可能会有所帮助。请记住,在大多数情况下,数组表达式的类型会从N-element array of T
隐式转换(衰减)到pointer to T
,或T *
1 。在data_set1,data_set2和data_set3的情况下,T
为char *
,因此表达式data_set1
会从4-element array of char *
隐式转换为pointer to char *
或{{ 1}}。其他两个数组也是如此,如下表所示:
Array Type Decays to ----- ---- --------- data_set1 char *[4] char ** data_set2 char *[5] char ** data_set3 char *[6] char **
如果您正在创建这些表达式的数组(这似乎是您尝试做的),那么数组声明需要
char **
给了我们
Array Type Decays to ----- ---- --------- ptr_char char **[4] char ***
因此,ptr_char是指向char或char **ptr_char[] = {data_set1, data_set2, data_set3, NULL};
指针的指针数组。将char **ptr_char[4]
参数传递给显示函数时,它再次从类型ptr_char
隐式转换为4-element array of char **
或pointer to char **
。
<小时/> 1.此规则的例外情况是数组表达式是
char ***
或sizeof
(地址)运算符的操作数,或者表达式是否是用于初始化另一个数组的字符串文字在声明中。
答案 3 :(得分:1)
我在尝试(失败)调试你编写的版本后重新编写了你的程序:
#include <stdio.h>
void display_char_array(char ***ptr_char)
{
for ( ; *ptr_char != NULL; ptr_char++ ) {
char **data_set;
for ( data_set = *ptr_char; *data_set != NULL; data_set++ ) {
printf("data [ %s ]\n", *data_set);
}
}
}
void initialize_char_array()
{
char *data_set1[] = {"dog", "cat", "bee", NULL};
char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL};
char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL};
char **ptr_char[] = { data_set1, data_set2, data_set3, NULL };
display_char_array(ptr_char);
}
int main( void )
{
initialize_char_array();
return 0;
}
您的版本会出现段错误,您对指针的使用非常混乱!
答案 4 :(得分:1)
错误是只使用data_set?中的第一个元素初始化ptr_char,见下文:
void initialize_char_array()
{
char *data_set1[] = {"dog", "cat", "bee", NULL};
char *data_set2[] = {"rabbit", "ant", "snake", "rat", NULL};
char *data_set3[] = {"cow", "lizard", "beaver", "bat", "hedgehog", NULL};
char **ptr_char[] = {data_set1, data_set2, data_set3, NULL};
display_char_array(ptr_char);
}
void display_char_array(char ***p)
{
while( *p )
{
while( **p )
{
puts(**p);
++*p;
}
++p;
}
}