为什么字符串缓冲区的溢出会导致 C 语言中的奇怪行为?[复制]

Why does the overflow of string's buffer result in the weird behavior in C? [duplicate]

提问人:Emiya 提问时间:9/19/2023 更新时间:9/19/2023 访问量:53

问:

我刚刚开始学习 C 编程语言,并正在测试一些控制流、stdio 功能。

这是我的代码:

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {
  char b[5], c[5];

  char arr[2][5];

  printf("Enter the first string: ");
  scanf("%s", b);
  printf("b -> %s\n", b);
  strcpy(arr[0], b);
  printf("arr[0] -> %s\n", arr[0]);

  printf("Enter the second string: ");
  scanf("%s", c);
  printf("c -> %s\n", c);
  strcpy(arr[1], c);
  printf("arr[1] -> %s\n", arr[1]);

  for (int i = 0; i < 2; i++) {
    printf("%d -> %s\n", i, arr[i]);
  }

  if (strcmp(b, c) == 0) {
    printf("Strings %s and %s are the same.\n", b, c);
  } else {
    printf("Strings %s and %s are not the same.\n", b, c);
  }

  return 0;
}

我遇到的问题是缓冲区溢出,也就是当我输入带有 5 个字符的字符串时,最初它会正确显示它,但在程序接近尾声时,结果变得一团糟。

在循环正确执行工作之前打印变量(假设我为两者提供输入字符串):forsomew

b -> somew
arr[0] -> somew

c -> somew
arr[1] -> somew

但是,在循环中,打印的结果是:for

0 -> somewsomew
1 -> somew

最后,最后的比较打印:

Strings     and somew are not the same.

我读到其中的字符串是,因此提供长度为 4 的单词,例如,解决了这个问题,我只想知道例如在循环中我是如何得到结果的,以及为什么变量在上次比较中是空的。Cnull terminatedfor0 -> somewsomewb

数组 C 字符串 循环 内存

评论

0赞 BoP 9/20/2023
没有真正的解释。越界写入是未定义的,任何事情都可能发生。

答: 暂无答案