c - 我刚刚读了指针和数组地址算术。但我已经搞混了

标签 c pointers

请您帮我理解指针。我刚刚阅读了指针和数组地址算术,所以我理解了递增指针指向的内容和递增指针指向的位置、将数组分配给指针和索引之间的区别。但我已经搞混了。

因此,在这本 K&R 书中,它解释了您可以修改指针以指向其他地方(我同意),但如果您将字符串常量的位置分配给指针,然后尝试修改字符串内容,则结果是未定义的。那么strcpy是如何工作的。

void strcpy(char *s, char *t)
{
    while (*s++ = *t++)
        ;
}

如果 s 和 t 是指向数组地址的指针,那么我相信它是有效的,因为 s 和 t 指向数组,而不是字符串常量,并且在 s = t != '\0' 时向下递增 t。 我在这里尝试了指针,将两个数组分配给两个指针,然后使用 strcpy

main()
{
    char array123[3] = "123";
    char array4[2] = "44";
    char *stringp1 = array123; 
    char *stringp2 = array4;
    strcpy(stringp1, stringp2);
    printf("%s", stringp1);
}

我遇到错误并拍摄了错误的图像:https://imgur.com/a/tXIKNmZ

所以我混淆了什么。我需要帮助。

最佳答案

char array4[2] = "44";

此处,array4 保存一个字符数组,但它保存字符串。

为什么?因为字符串被定义为一系列字符,其末尾标记为零字节。但是 array4 没有空间容纳额外的零字节。所以 array4 不是一个字符串。

char *stringp2 = array4;

好的,所以 stringp2 指向 array4,一个不是字符串的字符数组。

strcpy(stringp1, stringp2);

不好。 strcpy 函数的第二个参数必须是要复制的字符串

你想要这个:

char array4[3] = "44";

现在,array4 是一个字符串,因此 stringp2 指向一个字符串,因此作为源指针传递给 strcpy 是合法的。

关于c - 我刚刚读了指针和数组地址算术。但我已经搞混了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59606581/

相关文章:

C - pthread 段错误 11

c - 如何使用iso_8859-1在C程序中输出度数符号?

运行时在c源代码中编译另一个源代码

c - 如何在 C 中为 int(不是 int*)数组动态分配内存?

c++ - 空指针和应用程序崩溃

java - 更新对象时更新对对象的所有引用(reference to a reference)

C - 如何在 calloc 中使用自己的值(而不是 0)

c - 我在用 C 将字符串插入数组时遇到问题

c++ - 试图从指针 vector 中取消引用指针的段错误

C malloc() 与结构建议