功能打印单词列表



我正在努力理解这里出了什么问题。

void longestConsec(char* strarr[], int n) {
for(int i=0; i<n; i++)
{
printf("%sn",strarr[i]);
}
}
int main()
{
char string[8][14] = {"zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"};
longestConsec(string, 8);
return 0;
}

我想把每一个字都打印出来,但由于某种原因,它不起作用。我认为strarr是指向char的指针数组,所以在每个单元格中都应该有一个单词,对吧?但当我尝试调试代码时,我发现strarr和strarr[0]有不同的内存位置。为什么?

strarr是指向char的指针数组,但string不是指针数组,而是由14元素的chars数组组成的数组。

指针和14元素的字符数组可能有不同的大小,所以您的代码不能很好地工作。

使用这样的指针数组怎么样?

#include <stdio.h>
void longestConsec(const char* strarr[], int n) {
for(int i=0; i<n; i++)
{
printf("%sn",strarr[i]);
}
}
int main()
{
const char* string[8] = {"zone", "abigail", "theta", "form", "libe", "zas", "theta", "abigail"};
longestConsec(string, 8);
return 0;
}

编译器应该给您一个警告,给出一个很好的提示。

k.c:12:19: warning: passing argument 1 of ‘longestConsec’ from incompatible pointer type [-Wincompatible-pointer-types]
12 |     longestConsec(string, 8);
|                   ^~~~~~
|                   |
|                   char (*)[14]
k.c:2:26: note: expected ‘char **’ but argument is of type ‘char (*)[14]’
2 | void longestConsec(char* strarr[], int n) {
|                    ~~~~~~^~~~~~~~

string是数组的数组,char[8][14]strarr是指向char的指针char **的指针。当string被传递给函数时,它衰减为指向14个字符的数组char (*)[14]的指针。将多维数组传递给函数可能很棘手,但这很有效:

// size_t is better than int in this case
void longestConsec(size_t len, char strarr[][len], size_t n) 
{
for(int i=0; i<n; i++)
printf("%sn",strarr[i]);
}

然后称之为:

longestConsec(sizeof string[0]/sizeof string[0][0], // 14
string, 
sizeof string/sizeof string[0]        // 8
);

请注意,您可以编写sizeof string[0]而不是sizeof string[0]/sizeof string[0][0],但这是因为sizeof char始终为1。

理解这些声明可能有点棘手。只是给出一个如何声明它们的类型示例:

char (*arr)[10]; // arr is a pointer to array of char of size 10
char *arr[10];   // arr is an array of 10 pointers to char

相关:数组不是指针,指针不是数组

最新更新