目前,我在C中尝试了一些指针。但是现在,我有一个指针数组的问题。通过使用下面的代码,我得到一个奇怪的输出。我认为代码中存在一个很大的错误,但我找不到它。
我只想打印指针数组的字符串。
#include <stdio.h>
int main(void)
{
char *words[] = {"word1", "word2", "word3"};
char *ptr;
int i = 0;
ptr = words[0];
while(*ptr != '\0')
{
printf("%s", *(words+i));
ptr++;
i++;
}
return 0;
}
输出:word1word2word3Hã}¯HÉ
感谢您的帮助。
答案 0 :(得分:3)
while(*ptr != '\0')
{
printf("%s", *(words+i));
ptr++;
i++;
}
最初,ptr
指向'w'
中的"word1"
。所以循环迭代五次直到*ptr == '\0'
。但是数组words
只包含三个元素,因此第四次和第五次迭代调用未定义的行为,并且当words
数组之后的字节被解释为指向0终止字符串的指针时,将打印垃圾。它可能很容易崩溃,如果你在其他系统上尝试它,使用其他编译器或编译器设置,它有时会崩溃。
您可以将循环转换为
for(i = 0; i < strlen(words[0]); ++i) {
printf("%s", words[i]);
}
更容易看到它的作用。
如果要打印words
数组中的字符串,可以使用
// this only worls because words is an actual array, not a pointer
int numElems = sizeof words / sizeof words[0];
for(i = 0; i < numElems; ++i) {
printf("%s", words[i]);
}
由于words
是一个实际数组,您可以使用sizeof
获取它包含的元素数。然后循环多次,因为数组有元素。
答案 1 :(得分:1)
我认为您打算ptr
遍历words
数组中的项目,但事实上它实际上是在遍历“word1
”的字符。迭代遍历words
数组,同时假装不知道要迭代的项目数,然后按如下所示更改while条件:
int main(void)
{
char *words[] = {"word1", "word2", "word3"};
char numWords = sizeof(words) / sizeof( words[0]);
int i = 0;
while(i < numWords)
{
printf("%s", *(words+i));
i++;
}
return 0;
}
如果你真的想用ptr来遍历单词数组的项目,那么改变单词数组和while条件如下:
int main(void)
{
char *words[] = {"word1", "word2", "word3", NULL};
char *ptr[] = words;
int i = 0;
while(ptr[i] != NULL)
{
printf("%s", *(words+i));
i++;
}
return 0;
}