2016-05-13 41 views
-4

我有点新的指针。我在运行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; 
    } 

请发表任何有关此建议/解决方案。

+0

变化'INT * C;''到INT℃;'和'每个* C'为'C'。您可以为指针分配内存,或者只是将该变量放在堆栈上。 –

+0

这个特殊的问题可以通过适当的选项来确定。从g ++(和clang ++):“警告:'c'在此函数中使用未初始化[-Winitinitialized]”。 –

+0

欢迎来到SO。荣誉 - 你的代码不难编译,所以早期的贡献通常不会。它似乎比'C++'(不是相同的语言)更'C',所以请检查你的标签。 –

回答

0

我怀疑这是你试图做。

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

Thanx Rob :),我不知道* c = * a会将a的值复制到c。 – mouse

+0

它会但你还没有初始化它,所以它吹了你的segu错误的大块。 – Rob

+0

,解释这一切。谢谢 :) – mouse

0

的问题是,你永远在你的update()函数声明指针c分配内存:

int *c; // <<< not initialized 

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

int *c = new int(); 

delete c; 
:和离开你的功能时,它释放

当然,更简单的方法就是拥有可变

int c = *a; 
对函数的局部栈

,并省略提领:

c=abs(*a+*b); 
//^Note the * was removed 
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