我有小C程序 . 当我使用 gcc
编译它时,一切正常,但是当我尝试运行它时,我收到此消息:
分段故障(核心转储)
当我在 main()
上放置一个断点并启动程序时,我尝试使用 gdb and
调试它,我在 gdb
中收到此消息:
单步执行直到退出功能主,没有行号信息 . 程序接收信号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);
...
1 回答
您应该检查
N
的类型是否与atoi()
的返回值匹配 . 避免依赖隐式类型转换,因为这会导致 Value 变成您不期望的问题 .如果您使用所有警告(
gcc -Wall
)进行编译,那么您可能会看到此效果的警告 . 您可以使用GCC打开其他警告,listed in the documentation . 编写警告是一个很好的习惯 .此外,在处理指针时进入错误检查的(良好)习惯 . 确保在每次通话后检查是否成功分配了内存 .
换一种说法:
应该是这样的:
对每个
double
指针重复上述步骤 .我怀疑你的
N
的值是如此之大(并且N * N
甚至更大),你的系统在运行_1658099之前会耗尽内存 . 这应该有助于解决这种可能性 .