[英]C program using printf & scanf crashes on input
我正在编写以下 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
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);
分段错误是因为scanf
需要一个指向扫描值应存储在的变量的指针,但是您传递了变量pld
本身。 这是未初始化的,因此当被解释为指向野外的指针时。 tos
发生同样的情况。 当然,您应该为prot
分配适当的空间量,这在其他方面已被指出。
您为prot
分配的 memory 已为字符串分配了 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);
这可能不是您当前问题的根源,但它是一个错误:
prot = (char *)malloc(sizeof(char *));
我怀疑您打算制作一个字符指针大小的缓冲区。
无论如何,要查明您的直接问题,请在 valgrind 和/或调试器下运行您的程序。 在这种特殊情况下,仅启用编译器警告就会发现您的问题,即您按值传递整数,而您应该按指向 scanf 的指针传递整数。 这本可以由编译器解决,而不是来找我们,只要您启用相关选项。
scanf
需要指向您正在填充的变量的指针(字符串除外,它们已经是指向char
的指针)。
尝试
scanf(" %d", &pld);
和tos
一样。
scanf 函数族是作业中问题的主要来源。
当事情不起作用时,检查接收器 arguments,它们需要是要写入的项目的地址,并且类型必须与您在格式字符串中指定的相匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.