【问题标题】:Segmentation fault while taking string from user从用户获取字符串时出现分段错误
【发布时间】:2013-09-16 19:58:21
【问题描述】:

代码:

int main()
{
  char *name=NULL;
  int n;
  printf("\nenter the string\n");
  scanf("%s",name);
  n=strlen(name);
  printf("%d",n);
  return 0;
}

我遇到分段错误。代码有什么问题?我已经收录了stdio.hstdlib.hstring.h

【问题讨论】:

标签: c segmentation-fault


【解决方案1】:

您没有为指向 char name 的指针分配任何内存。

例子:

char * name = malloc( sizeof( char ) * MAX_STRING_LENGTH ) ;

【讨论】:

  • 所以如果我分配 100 个字符的内存并使用大小为 5 的字符串 .. 其余分配会发生什么?
  • @Hima 该内存将未被使用,但仍可通过指针供以后使用。
  • 如果你想让分配完美,那么计算字符内容,为该计数创建新的字符数组,将内容复制到这个新数组并释放前一个
  • @this.,你确实知道 sizeof (char) 定义为1,因此乘以它没有意义吗?
  • @ElchononEdelson 一致性 > 懒惰
【解决方案2】:

试试这个,

int main()

{
  char *name = malloc(sizeof( char ) * LENGTH); // define LENGTH as you desired

  int n;
  printf("\nenter the string\n");
  scanf("%s",name);
  n=strlen(name);
  printf("%d",n);

  free(name);
}

问题是你没有为指针分配内存。所以用malloc(BUFSIZE)分配内存tp指针。最后,您还必须使用 free(name) 释放分配的内存。

【讨论】:

    【解决方案3】:

    而不是char * name = malloc( sizeof( char ) * MAX_STRING_LENGTH ) ;

    使用

     char * name = malloc(MAX_STRING_LENGTH+1 ); //+1 is to store Null character 
    

    sizeof(char)==1 这样你就可以避免它。

    【讨论】:

    • sizeof(char) == 1 是正确的,但 malloc() 是错误的。在 C 中,你应该 not cast malloc()return value
    • @ElchononEdelson 有用的信息。我会更新答案。谢谢。
    【解决方案4】:

    C 不是托管语言,所以你需要告诉你的字符串(char *)你给它的内存长度。 malloc 函数来了。

    顺便说一句,没有 GarbageCollector,所以你需要释放你的 char * 才能使用它。

    但请注意,malloc 可以返回 null,因此您的 char * 将无法存储任何 char !

    int main(int argc, char **argv)
    {
        char *name = null;
        // Malloc your char *
        if ((name = malloc(sizeof( char ) * LENGTH_OF_YOUR_LARGER_INPUT)) == null)
        return;
        int n;
        printf("\nenter the string\n");
        scanf("%s",name);
        n=strlen(name);
        printf("%d",n);
        // Free the allocated memory to your char *
        free(name);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-24
      • 2022-01-11
      • 2020-11-27
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多