0


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

感谢您的帮助。

4

2 回答 2

3
while(*ptr != '\0')
{
    printf("%s", *(words+i));
    ptr++;
    i++;
}

最初,ptr指向'w'in "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. 然后你循环尽可能多的数组有元素。

于 2012-11-22T22:11:39.780 回答
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 来遍历 words 数组的项目,那么改变 words 数组和 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;
}
于 2012-11-24T05:27:23.320 回答