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

标签 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ɡ

感谢您的帮助。

最佳答案

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/

相关文章:

python - 我怎么能总是让 numpy.ndarray.shape 返回一个二值元组?

arrays - 如何从 powershell 中的扩展类型数组中提取/匹配文件类型扩展

c - 指针初始化以遍历数组

javascript - 当数组有元素时返回 Array[0] 的函数 | typescript /Javascript

c - 返回一个动态分配的数组? (C)

c - 两个指针指向相同的内存地址,如果这两个指针的释放发生在独立的地方,如何避免内存泄漏?

c - 为什么不能在数组中分配多个字符?

c - ISAPI扩展dll依赖路径

ios - 此代码是 C 语言还是 Objective-C 语言

c++ - 将仿函数作为函数指针传递