【问题标题】:what is Segmentation fault (core dumped)? [duplicate]什么是分段错误(核心转储)? [复制]
【发布时间】:2013-11-07 15:02:33
【问题描述】:

我正在尝试在 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;
}

在“shell>”提示符下输入我的输入后,gcc 给了我以下错误:

Segmentation fault (core dumped)

【问题讨论】:

  • 使用了错误的格式字符串,您需要%f,而不是%s
  • 试试int main(int argc, char *argv[])
  • 另外,打开你的编译器警告信息,它们会告诉你很多事情。

标签: c


【解决方案1】:

“分段错误”表示您试图访问您无权访问的内存。

第一个问题是您的 main 参数。 main 函数应该是int main(int argc, char *argv[]),并且在访问argv[1] 之前,您应该检查argc 至少为2。

此外,由于您将float 传递给printf(顺便说一下,当传递给printf 时,它被转换为double),您应该使用%f 格式说明符. %s 格式说明符用于字符串('\0' 终止字符数组)。

【讨论】:

  • 我被告知应该是int main(int argc, char** argv) 而不是int main(int argc, char *argv[])。虽然你说的方式是正确的,但`char**`是真正的“正确”方式,因为它表示一个指向字符指针的指针。
  • @WillHopkins 该标准规定int main(void)int main(int argc, char *argv[]) 或等效项是可以接受的,“等效项”后面的脚注表示“因此,int 可以替换为定义为@ 的typedef 名称987654338@,或者argv的类型可以写成char ** argv,以此类推。”所以真的,这是一个风格问题。 (见5.1.2.2.1 程序启动)
  • 是的,我只是想我会提到它,因为这就是我使用的:)
  • 能否请您多开发一点“并且您应该在访问 argv[1] 之前检查 argc 是否至少为 2”以帮助我理解它的含义?谢谢!
  • @Ni-Ar argcargv 中有多少个值。所以在你对argv[1]做任何事情之前,你需要确保argc &gt;= 2
猜你喜欢
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 2015-06-25
相关资源
最近更新 更多