2

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

6 回答 6

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

应该:

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

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

随着变化:

printf("\n enter the length of the payload::");
scanf(" %d",&pld);
printf("\n enter the tos :: ");
scanf(" %d",&tos);
于 2012-04-04T00:27:28.890 回答
3

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

于 2012-04-04T00:28:19.497 回答
3

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

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

char prot[128];

任何适合字符串的大小。

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

如果您的编译器没有就这些行向您发出警告:

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

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

scanf(" %d", &pld);
scanf(" %d", &tos);
于 2012-04-04T00:28:41.480 回答
1

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

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

我怀疑您是否打算制作一个大小为一个字符指针的缓冲区。

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

于 2012-04-04T00:27:19.450 回答
1

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

尝试

scanf(" %d", &pld);

和一样tos

于 2012-04-04T00:29:29.827 回答
0

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

  1. 他们总是期望地址,因此它们可以用作输出。
  2. 它们不能进行类型检查,因为该部分的原型是……,所以你可以在那里放任何东西。编译器不会抱怨。

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

于 2012-04-04T05:06:02.420 回答