运行时出现C应用程序错误

时间:2012-04-10 09:37:30

标签: c segmentation-fault

我已经构建了一个C应用程序,当我构建它时,它没有显示错误,但是当我运行它时,它给出了错误“Segmentation Fault:11”。 如果它有帮助,这是我正在使用的代码:

#include <stdio.h>
int main(char *argv[]) {
printf("The project path is: ./Projects/%c", argv[1]);
return 0;
}

5 个答案:

答案 0 :(得分:3)

正确的main原型语法是

int main(int argc, char *argv[]) { ... }

%c中的printf转换规范也打印一个字符,打印字符串时使用%s

答案 1 :(得分:1)

你有很多问题:

  • main的签名是一个参数计数,后跟一个C字符串数组。
  • 在使用阵列之前,您应该始终检查计数。
  • 数组是字符串,因此您需要%s来打印它们。

这应该有效:

#include <stdio.h>
int main(int argc, char *argv[]) {
    if (argc < 2)
        fprintf (stderr, "Wrong number of arguments\n");
    else
        printf ("The project path is: ./Projects/%s\n", argv[1]);
    return 0;
}

答案 2 :(得分:0)

  1. 将签名更改为int main(int, char*[]);
  2. 你传递给这个过程的论点是什么?如果您未通过任何argv[1]超出范围

答案 3 :(得分:0)

首先,将您的主要内容更改为:

int main(int argc, char *argv[]) 

其次,你传递给printf的内容与你告诉它的内容之间存在不匹配。 argv[1]是字符的指针,而不是字符。您需要/想要使用%s转换将其打印出来:

printf("The project path is: ./Projects/%s", argv[1]);

在这种特定情况下,检查足够的参数并不是必须的,因为即使你没有传递任何命令行参数,argv至少会包含argv[0]后跟一个空指针。因此,使用argv[1]是安全的,但如果您没有传递命令行参数,则可以打印为类似(null)的内容。

尽管如此,您通常希望在使用argc之前检查argv的值。在这种情况下,你可以逃脱它,但只是偶然或多或少。尝试以相同的方式使用argv[2]可能会产生未定义的行为。

答案 4 :(得分:0)

除了其他建议之外,您可能还需要重新访问printf格式。 %c用于打印单个字符,argv[1]char *。使用argv[1][0]或其他类似内容,或使用字符串格式说明符%s