C 使用指针数组打印字符串

C 使用指针数组打印字符串,c,C,我正准备复习代码考试,突然看到了这张幻灯片。你们中有谁能帮助我理解如何从指向数组的指针打印字符串吗?以下是代码示例: #include <stdio.h> int main(void) { size_t i; const char *suit[4] = { "Hearts", "Diammonds", "Clubs", "Spades" }; printf("The

我正准备复习代码考试,突然看到了这张幻灯片。你们中有谁能帮助我理解如何从指向数组的指针打印字符串吗?以下是代码示例:

#include <stdio.h>

int main(void)
{
    size_t i;
    const char *suit[4] = { "Hearts", "Diammonds", "Clubs", "Spades" };

    printf("The strings in array const char*suit[4] is:\n\n");


    for (i = 0; i < 5; i++)
    {
        printf("const char *suit[%u] is: %s\n", i, suit[i]);
    }
}
然而,它也伴随着这个错误。 指针Practice.exe中0x7AAD170C UCRTBASE.dll处引发异常:0xC0000005:访问冲突读取位置0xCCCC

为什么会有错误?如何打印相同的输出,但没有错误


提前谢谢大家

一个简单的修复!数组中只有4个元素,但正在迭代5次。尝试访问suit[5]将在Linux上引发分段错误,或在Windows上引发访问冲突。这些错误发生在您访问不应该访问的内存时。如果您试图访问0xEABCC8,但您无权访问它,您将遇到其中一个错误。 尝试将最大绑定更改为4,而不是5。 在C和其他语言中,索引从0开始,但初始化从1开始。例如:

const int foo[4]={6,9,3,2};//创建一个包含4个元素的数组。 foo[4]//获取从零开始的第五个元素, foo[0]//因此这是第一个元素。
一个简单的修复!数组中只有4个元素,但正在迭代5次。尝试访问suit[5]将在Linux上引发分段错误,或在Windows上引发访问冲突。这些错误发生在您访问不应该访问的内存时。如果您试图访问0xEABCC8,但您无权访问它,您将遇到其中一个错误。 尝试将最大绑定更改为4,而不是5。 在C和其他语言中,索引从0开始,但初始化从1开始。例如:

const int foo[4]={6,9,3,2};//创建一个包含4个元素的数组。 foo[4]//获取从零开始的第五个元素, foo[0]//因此这是第一个元素。
最大的指数是3。您的循环正在尝试访问不存在的索引4


唉。

最大的指数是3。您的循环正在尝试访问不存在的索引4


唉。

正如许多人指出的那样,您正试图访问数组中不存在的元素

您还需要将打印行更改为以下内容,因为您正在打印字符串本身,并且已经按suit[i]取消引用指针

for (i = 0; i < 4; i++)
{
    printf("const char *suit[%lu] is: %s\n", i, suit[i]);
}

正如许多人指出的,您正在尝试访问数组中不存在的元素

您还需要将打印行更改为以下内容,因为您正在打印字符串本身,并且已经按suit[i]取消引用指针

for (i = 0; i < 4; i++)
{
    printf("const char *suit[%lu] is: %s\n", i, suit[i]);
}

正如您在代码中发现的,打印数组字符串的循环正在访问超出其大小的数组。 要避免再次重复此错误,请按照以下机制获取阵列的大小:

size_t sz = sizeof (arr) / sizeof (arr[0]);
在您的情况下,您应该:

    for (size_t i = 0; i < sizeof (suit) / sizeof (suit[0]); ++i)
    {
        printf("const char *suit[%zu] is: %s\n", i, suit[i]);
    }
要检查它,您可以

#include <stdio.h>

int main(void)
{
    const char *suit[] = { "Hearts", "Diammonds", "Clubs", "Spades" };

    printf ("Size of suit array : %zu\n", sizeof (suit) / sizeof (suit[0]));

    return 0;
}

正如您在代码中发现的,打印数组字符串的循环正在访问超出其大小的数组。 要避免再次重复此错误,请按照以下机制获取阵列的大小:

size_t sz = sizeof (arr) / sizeof (arr[0]);
在您的情况下,您应该:

    for (size_t i = 0; i < sizeof (suit) / sizeof (suit[0]); ++i)
    {
        printf("const char *suit[%zu] is: %s\n", i, suit[i]);
    }
要检查它,您可以

#include <stdio.h>

int main(void)
{
    const char *suit[] = { "Hearts", "Diammonds", "Clubs", "Spades" };

    printf ("Size of suit array : %zu\n", sizeof (suit) / sizeof (suit[0]));

    return 0;
}

正如您在输出中看到的,最大的索引是3。您的循环正在尝试访问不存在的索引4。你为什么认为你需要这样做?我没有任何借口。谢谢你帮我发现我的错误@FermiToh printfconst char*suit[%u]是:%s\n,i,*suit[i];这不可能是真正的代码*西服[i]是一个字符,用%s格式打印它永远不会产生您引用的字符串。@dxiv是的,抱歉!它不应该有那个“*”!非常感谢你发现了它!正如您在输出中看到的,最大的索引是3。您的循环正在尝试访问不存在的索引4。你为什么认为你需要这样做?我没有任何借口。谢谢你帮我发现我的错误@FermiToh printfconst char*suit[%u]是:%s\n,i,*suit[i];这不可能是真正的代码*西服[i]是一个字符,用%s格式打印它永远不会产生您引用的字符串。@dxiv是的,抱歉!它不应该有那个“*”!非常感谢你发现了它!我想你的意思是试图进入西服[4]@FermiToh当然!嗯,西服是一个长度为四的阵列。套装包含的数据类型是字符串,字符串本身就是一个字符数组。因此,*suit[4]表示在suit数组中取第四个字符串,*符号只返回指向该字符串的指针。最后,你得到了一个指向字符数组的指针。您将获得一个指向字符串的指针。据我所知,你不应该提供*字符。C应该把它交给你,我明白了!所以它是一个指向数组的指针,数组包含一个字符串数组。还有,内存位置呢?如果我没有错的话,字符串中的每个字符都有自己的记忆位置,对吗?@MiloBanks,非常感谢!我可以知道吗,那你怎么知道
是否引用字符串数组中的每个元素?假设我想打印“H”“e”“a”“r”“t”的地址?每个字母表元素都应该有自己的地址。P.S对你的评论投了赞成票:“很简单。为了一个接一个地获取每个字符,只需在字符串上循环。如果您想动态获取字符串的大小,以便知道迭代的时间,只需:strensuit[i]。所以对于int l=0;l