下面是我的程序
#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语句一次之后,就会发生segfault。
但是,如果我在program中注释第一个printf语句并重新编译,则输出为
Segmentation fault (core dumped)为什么评论
printf("\n k = %d", k); // 1st printf是不是让程序更早的出现段错?
发布于 2017-01-22 18:50:58
mix_buffer[k]=1您正在写入数组,但未分配它。这会触发Segfault
要分配它,您可以执行以下操作:
int mix_buffer[100];//alocates it, with index 0..99发布于 2017-01-22 19:14:42
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;
}
}https://stackoverflow.com/questions/41789848
复制相似问题