我对指针有点新意。我在使用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 :(得分: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