我正在努力理解这里出了什么问题。
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
相关:数组不是指针,指针不是数组