gpt4 book ai didi

c++ - 段错误位置因printf而不同

转载 作者:行者123 更新时间:2023-11-30 03:34:47 25 4
gpt4 key购买 nike

下面是我的程序

#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;
}
}

关于c++ - 段错误位置因printf而不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41789848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com