分段故障位置因 printf 而异

Segmentation fault location differs because of printf

本文关键字:printf 而异 位置 故障 分段      更新时间:2023-10-16

下面是我的程序

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main() {
  int i;
  int* mix_buffer = &i;
  int k = 0;
  while(1) {
  mix_buffer[k]=1;
  printf("n k = %d", k); // 1st printf
  printf("n mix_buffer[%d] = %d k = %d", k, mix_buffer[k], k); //2nd printf  
  k++;
}
}

当使用 g++(版本 5.4)编译并且运行输出为

 k = 0
 mix_buffer[0] = 1 k = 0
Segmentation fault (core dumped)

即段错误发生在一次遍历两个 printf 语句之后。

但是,如果我注释程序中的第一个 printf 语句并重新编译,则输出为

Segmentation fault (core dumped)

为什么评论

printf("n k = %d", k); // 1st printf

导致程序更早地出现段错误?

int i;
int* mix_buffer = &i;

我认为您应该首先修复变量mix_buffer的名称,这是误导性的。它只是一个指向 int 的指针,指针本身不能是任何缓冲区 - 它必须指向某个缓冲区,并且您必须先分配该缓冲区。

在这种情况下,正如注释中指出的那样,它是UB(段错误),因为您只需使用数组索引访问mix_buffer作为真正的缓冲区而不分配它。只要k大于或等于1程序都是未定义的。

要解决此问题,您应该首先正确分配 int 缓冲区。类似的东西

int buffer[100] = {0};

然后可以使用 while(1) 循环,但您必须注意越界访问并根据检查k值终止,例如

while( 1 )
{
    ...
    if( k++ >= 100 )
    {
         break;
    }
}
mix_buffer[k]=1

您正在写入数组,但未分配它。这将触发隔离错误

要分配它,您可以执行以下操作:

int mix_buffer[100];//alocates it, with index 0..99