下面是我的程序
#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