什么是分段故障(核心转储)?

use*_*110 88 c

我试图在linux中编写一个具有sqrt参数的C程序,这是代码:

#include<stdlib.h>
#include<stdio.h>
#include<math.h>

int main(char *argv[]){
    float k;
    printf("this is consumer\n");
    k=(float)sqrt(atoi(argv[1]));
    printf("%s\n",k);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在"shell>"提示符下输入输入后,gcc给出了以下错误:

Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

Eri*_*inn 118

"分段错误"表示您尝试访问无权访问的内存.

第一个问题是你的论点main.该main功能应该是int main(int argc, char *argv[]),您应该argc在访问之前检查至少为2 argv[1].

此外,由于你传递一个floatprintf(其中,顺便说一句,被转换成一个double路过的时候printf),你应该使用的%f格式说明.该%s格式说明为字符串('\0'封端的字符数组).

  • 我被教导它应该是`int main(int argc, char** argv)` 而不是`int main(int argc, char *argv[])`。尽管你的表达方式是正确的,` char\*\*` 是真正的“正确”方式,因为它代表一个指向字符指针的指针。 (3认同)
  • @WillHopkins标准说`int main(void)`和`int main(int argc,char*argv [])`或等价物是可以接受的,在"等效"之后的脚注说"因此,'int`可以被替换通过定义为`int`的typedef名称,或者`argv`的类型可以写成`char**argv`,依此类推." 真的,这是一个风格问题.(见5.1.2.2.1程序启动) (2认同)
  • 是的,我只是想我会提到它,因为那是我使用的:) (2认同)