在gdb中获取seg错误(调试)

时间:2016-05-13 18:43:34

标签: c

我对指针有点新意。我在使用ububtu中的gcc编译器运行下面的代码时收到此错误。

Error:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7de7c13 in _dl_fini () at dl-fini.c:235
235 dl-fini.c: No such file or directory

    #include <stdio.h>
    #include <cmath>
    #include<stdlib.h>
    void update(int *a,int *b) {
        int *c;
        *c=*a;
        *c=abs(*a+*b);
        *b=abs(*a-*b);
        *a=*c;
    }

    int main() {
        int a, b;
        int *pa = &a, *pb = &b;

        scanf("%d %d", &a, &b);
        update(pa, pb);
        printf("%d\n%d", a, b);

        return 0;
    }

请发布有关此事的任何建议/解决方案。

3 个答案:

答案 0 :(得分:0)

我怀疑这是你要做的事。

void update(int *a,int *b) {
    int c;
    c=*a;
    c=abs(*a+*b);
    *b=abs(*a-*b);
    *a=c; 
}

答案 1 :(得分:0)

问题是你永远不会为c函数中声明的指针update()分配内存:

int *c; // <<< not initialized

您必须分配内存才能使用该指针:

int *c = new int();

离开你的职能时释放它:

delete c;

当然,更简单的方法就是拥有一个变量

int c = *a;

在函数本地堆栈上,省略解除引用:

    c=abs(*a+*b);
// ^ Note the * was removed

答案 2 :(得分:0)

由于您使用c++标记了您的问题并且您的代码与c++无关,因此这里有真正的 c++代码:

#include <iostream>
#include <cmath>

void update(int &a,int &b) {
   int c;
   c=a;
   c=abs(a+b);
   b=abs(a-b);
   a=c;
}

int main() {
   int a, b;

   std::cin >> a;
   std::cin >> b;
   update(a, b);
   std::cout << a << std::endl << b << std::endl;

}

我强烈建议您使用一些编译器标志,这些标志在编译时甚至代码都没有生成时已经警告过你。

对于g++我建议的选项是:

-std=c++11 -Wall -Werror -Wextra