分段故障-C

分段故障-C,c,segmentation-fault,C,Segmentation Fault,为什么下面的代码返回分段错误?当我注释掉第7行时,seg故障消失 int main(void){ char *s; int ln; puts("Enter String"); // scanf("%s", s); gets(s); ln = strlen(s); // remove this line to end seg fault char *dyn_s = (char*) malloc (strlen(s)

为什么下面的代码返回分段错误?当我注释掉第7行时,seg故障消失

int main(void){
      char *s;
      int ln;
      puts("Enter String");
      // scanf("%s", s);
      gets(s);
      ln = strlen(s); // remove this line to end seg fault
      char *dyn_s = (char*) malloc (strlen(s)+1); //strlen(s) is used here as well but doesn't change outcome
      dyn_s = s;
      dyn_s[strlen(s)] = '\0';
      puts(dyn_s);
      return 0;
    }

干杯

s
是未初始化的指针;您正在写入内存中的随机位置。这将调用未定义的行为

您需要为
s
分配一些内存。也,;没有办法防止它溢出您分配的内存。改用fgets。

灾难性坏:

int main(void){
      char *s;
      int ln;
      puts("Enter String");
      // scanf("%s", s);
      gets(s);
      ln = strlen(s); // remove this line to end seg fault
      char *dyn_s = (char*) malloc (strlen(s)+1); //strlen(s) is used here as well but doesn't change outcome
      dyn_s = s;
      dyn_s[strlen(s)] = '\0';
      puts(dyn_s);
      return 0;
    }
更好:

#include <stdio.h>
#define BUF_SIZE 80

int 
main(int argc, char *argv[])
{
      char s[BUF_SIZE];
      int ln;
      puts("Enter String");
      // scanf("%s", s);
      gets(s);
      ln = strlen(s); // remove this line to end seg fault
      char *dyn_s = (char*) malloc (strlen(s)+1); //strlen(s) is used here as well but doesn't change outcome
      dyn_s = s;
      dyn_s[strlen(s)] = '\0';
      puts(dyn_s);
      return 0;
    }
#包括
#定义BUF_尺寸80
int
main(int argc,char*argv[])
{
字符s[BUF_大小];
int-ln;
放入(“输入字符串”);
//scanf(“%s”,s);
获取(s);
ln=strlen(s);//删除此线路以结束seg故障
char*dyn_s=(char*)malloc(strlen(s)+1);//这里也使用strlen(s),但不会改变结果
dyn_s=s;
dyn_s[strlen(s)]='\0';
看跌期权;
返回0;
}
最佳:

#包括
#定义BUF_尺寸80
int
main(int argc,char*argv[])
{
字符s[BUF_大小];
int-ln;
放入(“输入字符串”);
fgets(s,BUF_SIZE,stdin);//使用fgets(我们的“cin”):从不使用“get()
int ln=strlen(s);
char*dyn_s=(char*)malloc(ln+1);
strcpy(dyn_s,s);
看跌期权;
返回0;
}
您的
scanf(“%s”,s)被注释掉。这意味着s未初始化,因此当此行
ln=strlen(s)执行时,会出现seg故障

将指针初始化为NULL总是有帮助的,然后在使用指针之前测试NULL。

更好

#include <stdio.h>
int
main(void)
{
  char *line = NULL;
  size_t count;
  char *dup_line;

  getline(&line,&count, stdin);
  dup_line=strdup(line);

  puts(dup_line);

  free(dup_line);
  free(line);

  return 0;
}
#包括
int
主(空)
{
char*line=NULL;
大小/数量;
字符*重复线;
getline(&line,&count,stdin);
dup_线=标准向上(线);
puts(重复线);
免费(重复线路);
自由线;
返回0;
}

这不会导致分段错误,因为您将不再引用未知位置

更好:
char*dyn\u s=malloc(ln+1)。请注意,
fgets()
将终止的
'\n'
留在缓冲区中
gets()
放弃它(但是
gets()
仍然是灾难性的糟糕)。酷!谢谢任何你有链接的优秀资源,都可以查看常用IO函数的行为?除了
cast
malloc()
结果删除之外,还可以检查你是否没有收到
NULL
值<代码>字符*dyn_s=malloc(ln+1);如果(!dyn_s){printf(“No mem!\n”);exit(exit_FAILURE)}
或者您可以得到另一个分段错误。@共振分形:签出:非常感谢!请原谅我是一个讨厌的人,但是,我要理解的是,添加我提到的线路,会导致未定义的行为导致seg故障。你能帮我把因果关系想象得更清楚一点吗?@很难说。根据定义,未定义的行为意味着您的程序可以做任何事情,包括以不可预知的方式失败。我可以猜测,但唯一确定的方法是查看编译器生成的机器代码。因为
strlen()
函数试图访问不存在的空间。与strlen(空)
相同。函数内部有如下内容:
size\t strlen(char*s){char*p=s;while(
*p++
<这会导致分段错误。@TheMask谢谢!但是第8行中使用相同strlen表达式的malloc呢?如果我只删除第7行,整个程序运行时没有任何错误。或者你们得到了什么不同的东西吗?如果我删除第7行或第8行,我会得到相同的错误。因为实际上,错误从
get()开始
调用,而不是我前面说过的
strlen()
(但原因是一样的),抱歉。如果您不了解
gdb
,请参阅关于,我建议您使用它。它对于检测错误非常有用。例如,如果您使用gdb a.out运行程序,您将得到:
输入字符串foo程序接收信号SIGSEGV,分段错误。_IO_get(buf=0x282ff4“| M\025”)在iogets.c:55
。谢谢!将更频繁地进行空指针初始化和测试。我不认为我得到了scanf部分。scanf是否也应该失败?毕竟,指针没有初始化到任何东西,可能指向某个任意和非法的位置作为字符串的起始位置,因此出现seg错误?我从包括它也会导致seg故障。或者我没有理解什么?这个答案是错误的。如果你将指针初始化为NULL,这也会导致UB-NULL永远不会被取消引用,即使是scanf…我测试我的指针,看看它们是否设置为NULL。如果在使用之前初始化为NULL,那么有一个合理的错误可能指针尚未分配给有效内存。您好!我从未使用过getline()和strdup()函数。我想我以前也没有见过它们。谢谢你向我介绍;)。嗯,很不幸,你的代码遇到了seg错误!奇怪。关于隐式声明的警告,对我来说是正确的。GNU/Linux系统,gcc 4.6.3。
应该初始化为NULL。是的,C可能很残忍。酷!谢谢KAction!有点busy最近。我保证我会在不久的将来深入研究你代码的内部阴谋。祝你周末愉快。干杯!@Lundin,请指出这是什么的副本?如果你指的是,我会声明我的问题比你大4岁
#include <stdio.h>
int
main(void)
{
  char *line = NULL;
  size_t count;
  char *dup_line;

  getline(&line,&count, stdin);
  dup_line=strdup(line);

  puts(dup_line);

  free(dup_line);
  free(line);

  return 0;
}
char *s  does not have some memory allocated . You need to allocate it manually in your case . You can do it as follows
s = (char *)malloc(100) ;