首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分段故障定位因printf的不同而不同

分段故障定位因printf的不同而不同
EN

Stack Overflow用户
提问于 2017-01-22 18:31:29
回答 2查看 67关注 0票数 1

下面是我的程序

代码语言:javascript
运行
复制
#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)编译此命令时,运行输出为

代码语言:javascript
运行
复制
 k = 0
 mix_buffer[0] = 1 k = 0
Segmentation fault (core dumped)

也就是说,在遍历两个printf语句一次之后,就会发生segfault。

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

代码语言:javascript
运行
复制
Segmentation fault (core dumped)

为什么评论

代码语言:javascript
运行
复制
printf("\n k = %d", k); // 1st printf

是不是让程序更早的出现段错?

EN

回答 2

Stack Overflow用户

发布于 2017-01-22 18:50:58

代码语言:javascript
运行
复制
mix_buffer[k]=1

您正在写入数组,但未分配它。这会触发Segfault

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

代码语言:javascript
运行
复制
int mix_buffer[100];//alocates it, with index 0..99
票数 1
EN

Stack Overflow用户

发布于 2017-01-22 19:14:42

代码语言:javascript
运行
复制
int i;
int* mix_buffer = &i;

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

在本例中,正如注释中所指出的,它是UB (段错误),因为您只是使用数组索引将mix_buffer作为实际缓冲区来访问,而没有分配它。任何时候,当你的k大于或等于1时,你的程序是未定义的。

要解决这个问题,您应该首先正确地分配int缓冲区。就像这样

代码语言:javascript
运行
复制
int buffer[100] = {0};

然后就可以使用while(1)循环了,但是您必须注意外部访问,并通过检查k值来终止它,比如

代码语言:javascript
运行
复制
while( 1 )
{
    ...
    if( k++ >= 100 )
    {
         break;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41789848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档