目前,我正在尝试用 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ɡ
感谢您的帮助。
最佳答案
while(*ptr != '\0')
{
printf("%s", *(words+i));
ptr++;
i++;
}
最初,ptr
指向"word1"
中的'w'
。所以循环迭代五次,直到 *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
获取它包含的元素数。然后循环次数与数组中的元素数一样多。
关于c - 在 C 中打印字符指针数组时出现奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13520606/