在C中打印字符指针数组时输出奇怪

时间:2012-11-22 22:07:11

标签: c arrays pointers while-loop


目前,我在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É

感谢您的帮助。

2 个答案:

答案 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;
}