C程序使用printf& scanf在输入时崩溃

时间:2012-04-04 00:24:38

标签: c segmentation-fault scanf

我正在编写以下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

6 个答案:

答案 0 :(得分:5)

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

应该是:

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

另一个问题是:您应该在&中使用scanf()来表示整数!

随着变化:

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

答案 1 :(得分:3)

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

答案 2 :(得分: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);

答案 3 :(得分:1)

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

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

我怀疑你的意思是将缓冲区设为一个字符指针的大小。

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

答案 4 :(得分:1)

scanf期望指向您正在填充的变量(除了字符串,已经指向char)。

尝试

scanf(" %d", &pld);

tos相同。

答案 5 :(得分:0)

scanf系列功能是家庭作业中问题的主要来源。

  1. 他们总是期望地址,所以它们可以用作OUTPUT。
  2. 它们无法进行类型检查,因为该部分的原型是......,所以你可以放任何东西。编译器不会抱怨。
  3. 当事情不起作用时,检查接收器参数,它们需要是要写入的项的地址,并且类型必须与格式字符串中指定的类型相匹配。