分段故障位置因 printf 而异
Segmentation fault location differs because of printf
下面是我的程序
#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
相关文章:
- C++ 代码的行为因编译器而异
- 随机数生成器的性能因平台而异
- 班级大小因模块 (DLL) 而异.如何以及为什么?
- 虚拟指针大小因类数据成员而异
- 包含标头中的搜索路径因编译器而异
- 为什么汇编代码因我使用的反汇编程序而异
- 以下代码的输出是什么(答案因差异编译器而异)
- 引用基类的 constexpr 构造函数因编译器而异
- 分段故障位置因 printf 而异
- 重新解释的值因编译器而异
- sizeof(std::list<T>) 可以因不同类型的 T 而异吗?
- 如何引用要以C++打开的文件,因为其完整路径名将因计算机而异
- C++ 静态成员函数错误 C2556 重载函数仅因返回类型而异
- 强制转换函数指针,该指针因参数类型而异
- 未使用的变量警告因自动变量而异
- UDP数据包丢失因数据包大小而异
- 浮点常量值因C++声明方式而异(Xcode IDE)
- 模板方法,其参数数量为实例化固定,但因模板参数而异
- 套接字连接超时因网络而异
- 一元:为什么一元在 c# 中的行为因 c/c++ 而异