我有小C程序。当我使用gcc
编译它时,一切正常,但是当我尝试运行它时,我收到此消息:
Segmentation fault (core dumped)
当我在gdb and
上放置断点并启动程序时,我尝试使用main()
调试它,我在gdb
中收到此消息:
单步执行直到从函数main退出,该函数没有行 号码信息。
编程接收信号SIGSEGV,分段故障。
0x00007ffff7a56ad4在? ()来自/lib/x86_64-linux-gnu/libc.so.6
这是我的mani()函数的开始:
int main(int argc, char **argv) {
long N;
double *A, *B, *C, t;
srand(time(NULL));
N = atoi(argv[1]);
A = (double *) malloc(N * N * sizeof(double));
B = (double *) malloc(N * N * sizeof(double));
C = (double *) malloc(N * N * sizeof(double));
matFillSimple(N, A, 1.0);
matFillSimple(N, B, 2.0);
matFillSimple(N, C, 0.0);
...
答案 0 :(得分:2)
您应该检查N
的类型是否与atoi()
的返回值匹配。避免依赖隐式类型转换,因为这会导致价值变成您不期望的事情的问题。
如果您使用所有警告(gcc -Wall
)进行编译,那么您可能会看到对此效果的警告。您可以使用GCC listed in the documentation启用其他警告。编写警告是一个良好的习惯。
此外,在处理指针时进入错误检查的(良好)习惯。确保在每次通话后检查是否成功分配了内存。
换句话说:
A = (double *) malloc(N * N * sizeof(double));
...
应该是这样的:
double *A = NULL;
A = malloc(N * N * sizeof(double));
if (!A) {
fprintf(stderr, "ERROR: Could not allocate space for A\n");
return EXIT_FAILURE;
}
...
对每个double
指针重复一次。
我怀疑你的N
的价值是如此之大(N * N
甚至更大),你的系统在运行matFillSimple()
之前会耗尽内存。这应该有助于解决这种可能性。