【问题标题】:Segmentation fault while using printing output of strlen in C++ 4.8.1 [closed]在 C++ 4.8.1 中使用 strlen 的打印输出时出现分段错误 [关闭]
【发布时间】:2014-06-21 16:42:34
【问题描述】:
#include<cstdio>
#include<cstring>
#include<cstdlib>

int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        char *str;
        scanf("%s",str);
        int l,n,nop=1;
        l=strlen(str);
        printf("Length %d",l); //causing segmentation fault
        if(l%2==0)n=l/2;
        else n=(l-1)/2;
        for(int i=0;i<n;i++)nop=nop+abs(str[i]-str[l-1-i]);
        printf("%d\n",nop);
    }
    return 0;
}

打印字符串长度时出现错误。如果我删除该行代码可以工作,但输出不正确。 该代码适用于 DevC++

【问题讨论】:

  • char *str; scanf("%s",str); 可爱。指针不会自动指向可以存储无限大小字符串的内存。
  • 你在哪里初始化str
  • @chris 的意思是告诉你你在 str 之前缺少一个 &,这会导致内存损坏。
  • @bmargulies,嗯,不,因为%s 期望char *,而不是char **,但是是的,我编辑了更多信息。
  • 是的,这是故意的。

标签: c++ segmentation-fault strlen


【解决方案1】:

您需要通过为其分配空间来初始化str

char *str = (char *)malloc(SIZE);  

否则它将调用未定义的行为。另外,声明size_t 类型的l,因为strlen 返回类型是size_t,并在printf 中将%d 更改为%zu

【讨论】:

  • 我收到以下错误:从 'void*' 到 'char*' 的无效转换 [-fpermissive]
  • malloc的返回值转换为char *
  • 是的,现在可以使用了。但是我的代码在 DevC++ 上使用正确的输出为什么会发生这种情况?
  • 请编辑您的答案以包含 (char *)
  • @HarishVishwakarma 这是未定义的行为,意味着任何事情都可能发生。看似正常工作并默默地破坏你的记忆是“任何事情”,就像崩溃或格式化你的硬盘驱动器或让你的计算机着火或让恶魔从你的鼻子里飞出来一样。
猜你喜欢
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 2013-11-10
  • 2019-12-31
  • 1970-01-01
  • 2020-02-23
  • 2012-07-01
  • 2015-10-22
相关资源
最近更新 更多