【问题标题】:C program using printf & scanf crashes on input使用 printf 和 scanf 的 C 程序在输入时崩溃
【发布时间】:2012-04-17 16:50:11
【问题描述】:

我正在编写以下 c 代码并收到错误:

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

int main()
{
char *prot;
char addr[20];
FILE *fp;
int i = 0;
int tos,pld;

prot = (char *)malloc(sizeof(char *));
//addr = (char *)malloc(sizeof(char *));

printf("\n enter the protocol for test::");
scanf(" %s",prot);
printf("\n enter the addr::");
scanf(" %s",addr);
printf("\n enter the length of the payload::");
scanf(" %d",pld);
printf("\n enter the tos :: ");
scanf(" %d",tos);

输入值时出现以下错误。出现分段错误,谁能告诉我为什么会出现此分段错误:

enter the protocol for test::we

enter the addr::qw

enter the length of the payload::12

Segmentation fault

【问题讨论】:

    标签: c segmentation-fault scanf


    【解决方案1】:
    prot = (char *)malloc(sizeof(char *));
    

    应该是:

    prot = malloc(sizeof(char) * SIZE); // SIZE is the no. of chars you want
    

    另一个问题是:scanf() 中的整数应该使用 &amp;

    有变化:

    printf("\n enter the length of the payload::");
    scanf(" %d",&pld);
    printf("\n enter the tos :: ");
    scanf(" %d",&tos);
    

    【讨论】:

    • 你能解释一下 proto 的错误吗……我的意思是它可以正常打印整个内容……请解释一下……
    • 而且你也不应该从 malloc 中转换返回值。
    • 我觉得我的回答已经够清楚了。你不明白哪一部分? 'prot' 是一个字符指针。所以你应该分配内存。因此,您调用内存来分配将由“prot”指向的 SIZE 个字符。另一个是:您应该使用地址 (&) 来读取整数(在 scanf 中)。
    • @karan421,只需使用 prot = malloc(sizeof ... 而不使用演员表。从malloc 返回的void* 将自动转换为任何其他指针,并且显式转换它可以隐藏错误,例如当您忘记在malloc 原型中包含标头时。
    【解决方案2】:

    分段错误是因为scanf 需要一个指针 指向应存储扫描值的变量,但您传递了变量pld 本身。这是未初始化的,因此当被解释为指向野外的指针时。 tos 也是如此。当然,您应该为prot 分配适当数量的空间,正如已经指出的那样。

    【讨论】:

      【解决方案3】:

      您为prot 分配的内存已为字符串分配了 4 个字节(在 32 位系统上)或 8 个字节(在 64 位系统上)。如果你读取的内容超过了它,你的缓冲区就会溢出。

      除非有充分的理由不这样做,否则我会简单地使用:

      char prot[128];
      

      任何合适的字符串大小。

      您还应该检查您的所有scanf() 调用以确保它们成功;您可能应该对字符串的大小施加限制。对于char prot[128];,安全转换为%127s; null 不计入转换规范。

      如果你的编译器没有警告你这些行:

      scanf(" %d",pld);
      scanf(" %d",tos);
      

      您需要打开更多警告或获得更好的编译器。如果它警告您,请注意您的编译器;它对 C 的了解比你多(可能也比我多)。

      scanf(" %d", &pld);
      scanf(" %d", &tos);
      

      【讨论】:

        【解决方案4】:

        这可能不是您当前问题的根源,但它是一个错误:

        prot = (char *)malloc(sizeof(char *));
        

        我怀疑你的意思是让缓冲区大小只有一个字符指针。

        无论如何,要查明您的直接问题,请在 valgrind 和/或调试器下运行您的程序。在这种特殊情况下,仅启用编译器警告会引起您的问题,即您按值传递整数,而您应该通过指针传递给 scanf。只要您启用相关选项,编译器就可以解决这个问题,而不是找我们。

        【讨论】:

          【解决方案5】:

          scanf 需要指向您正在填充的变量的指针(字符串除外,它已经是指向 char 的指针)。

          试试

          scanf(" %d", &pld);
          

          tos 相同。

          【讨论】:

            【解决方案6】:

            scanf 系列函数是作业中问题的主要来源。

            1. 它们总是期望地址,因此它们可以用作 OUTPUT。
            2. 不能对它们进行类型检查,因为该部分的原型是 ...,因此您可以在其中放置任何内容。编译器不会抱怨。

            当事情不起作用时,检查接收器参数,它们需要是要写入的项目的地址,并且类型必须与您在格式字符串中指定的匹配。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-07-20
              • 2012-01-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多