【问题标题】:What will happen if pointer is incremented after assigning value to its memory location?如果指针在赋值给它的内存位置后增加会发生什么?
【发布时间】:2020-04-05 01:32:29
【问题描述】:

考虑以下示例,

#include <stdio.h>

int main()
{
    char charArr[3] = "c++";
    char *pointer = charArr;
    pointer+=3;
    *pointer = 'q';
    pointer+=1;
    *pointer = 'd';
    printf("%s", charArr);
    return 0;
}

我希望我会得到, c++qd 但我得到了 c++r

q 的值增加 1 并变为 'r',我尝试了其他增量,它反映了 ASCII。

【问题讨论】:

  • 你正在做的是 undefined,因为你超出了数组的范围......
  • 你也没有为空终止符留下空间。
  • 一旦你点击了未定义的行为,程序的结果就毫无意义了。
  • @Mirror 这很显而易见。一旦您使用any C++ 功能,您的代码就会变成C++,并且不能再编译为C。一旦您的代码是C++anyway,您不妨利用并不要坚持使用 C 的东西。C 和 C++ 不是同一种语言的变体;它们是非常不同的语言,您需要决定使用哪一种。
  • 所以不要用 C++ 语言标签来标记你的问题...

标签: c pointers memory stack


【解决方案1】:

charArr 仅足够容纳它初始化的三个字符。该数组不能保存任何其他字符,甚至没有空间用于终止空字节以使其成为正确的字符串。

这意味着您正在写超出数组的末尾。这样做会调用undefined behavior,在这种情况下表现为意外输出。

该数组的长度应至少为 6 个字节,以便它可以容纳额外的字符加上一个终止的空字节以使其成为一个字符串。您还需要添加该空字节。

char charArr[6] = "c++";
char *pointer = charArr;
pointer+=3;
*pointer = 'q';
pointer+=1;
*pointer = 'd';
pointer+=1;
*pointer = 0;

【讨论】:

  • 我知道空字节和数组声明。在这里,我只是在尝试指针。我感到惊讶只是因为我得到了'r',这发生在'q'增加时。如果它会导致编译错误或脏结果,我不会这么关心。
  • @Mirror UB 可以产生字面上的任何东西。程序被破坏是因为你违反了语言规则,任何结果对编译器来说都是有效的。
  • @Mirror 很可能,*pointer += 'q' 更改了指针,因为指针指向自身,pointer += 1 将 q 递增到 r,然后 *pointer = 'd'; 将一些随机内存位置设置为 d,然后你很幸运,这一切都以一种相对容易理解的方式发挥作用,而不仅仅是坠毁或飞入轨道。
  • @Mirror 字符串 末尾有“r”这一事实 是一个肮脏的结果。这就是 UB 在这种特殊情况下的表现。
【解决方案2】:

指针只是为了指出位置,你在更小的空间中输入数据,所以只需先增加 char 数组的长度然后处理,但是你的指针工作得很好。

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多