【问题标题】:Segmentation Fault(core dumped): Simple program but not working分段错误(核心转储):简单的程序但不工作
【发布时间】:2014-01-14 18:02:33
【问题描述】:
#include <stdio.h>

pac()
{
    int i,j,k,size;

    char ns[size];
    int nss[size];
    printf("ENTER THE NUMBER OF STUDENTS: ");
    scanf("%d",size);
    for(i=0;i<size;i++)
    {
        printf("ENTER THE NAME OF STUDENT: ");
        scanf("%c",ns[i]);
    }
    for(j=0;j<size;j++)
    {
        printf("ENTER THE MARKS OF THE STUDENT: ");
        scanf("%d",nss[j]);
    }


    for(k=0;k<size;k++)
    {
        printf("%c",ns[i]);
    }
}

main()

{

pac();

}

我知道错误太小,但我是 C 新手,所以请告诉我错误。 在第一次输入学生人数后,此代码中存在分段错误。

【问题讨论】:

  • size 未初始化,然后您使用它来设置数组大小,这是未定义的行为。
  • 更改size 的值不会神奇地调整数组的大小。您可能需要为此进行动态分配 (malloc)。
  • 沙菲克,这应该是一个答案,而不是评论。
  • @paxdiablo 你是对的。

标签: c segmentation-fault


【解决方案1】:

改变

scanf("%d",size);  
           ^You missed & operator here.  

scanf("%d", &size);  

现在由于您使用的是 VLA,因此您需要在获得 size 的值后声明您的 VLA。

printf("ENTER THE NUMBER OF STUDENTS: ");
scanf("%d", &size);
char ns[size];
int nss[size];

【讨论】:

  • @paxdiablo;谢谢。修好了。
  • 更接近。它仍然只允许每个学生使用一个字符的姓名。
【解决方案2】:

闻起来像家庭作业编程任务......

#include <stdio.h>
pac()
{
    int i,j,k,size;

    printf("ENTER THE NUMBER OF STUDENTS: ");
    scanf("%d",&size); // <-- need to pass in the address of size

    do { // <-- you need this to establish the size for array creation
        char ns[size];
        int nss[size];

        for(i=0;i<size;i++)
        {
            printf("ENTER THE NAME OF STUDENT: ");
            scanf("%c",&(ns[i])); // <-- need the address here, too
        }
        for(j=0;j<size;j++)
        {
            printf("ENTER THE MARKS OF THE STUDENT: ");
            scanf("%d",&(nss[j])); // <-- and again here
        }


        for(k=0;k<size;k++)
        {
            printf("%c",ns[i]);
        }
    } while(0);
}

main()

{

    pac();

}

【讨论】:

    【解决方案3】:

    size 未初始化,然后您使用它来设置数组大小,这是undefined behavior。正如 Fred 所说,稍后设置 size 不会神奇地重新调整数组的大小。

    您应该在初始化数组之前调用scanf,但您需要传入一个指针:

    scanf("%d",&size);
               ^
    

    您还依赖于 mainpac 的隐式 int,您应该明确设置它们的返回类型,对于 main 应该是 int,对于 pac 可能是 void

    您应该会看到其中大部分的警告,甚至无需打开它们。 gccclang 都为 implicit int 返回和不正确使用 scanf 提供警告,类似于:

    警告:返回类型默认为 'int' [默认启用]

    警告:格式“%d”需要“int *”类型的参数,但参数 2 的类型为“int”[-Wformat]

    并且出现警告也会给我一个使用size初始化的警告:

    警告:在此函数中使用了未初始化的“大小”[-Wuninitialized]

    【讨论】:

      【解决方案4】:

      这是所有答案的组合。

      1. 大小未初始化(已经说过)

      2. scanf 的第二个参数必须是指针(&size, &ns[i], ...)

      3. 根据大小值动态分配空间,或者使 ns 和 nss 具有足够的固定大小(#define MAX_SIZE 1000 并检查大小

      你可以这样编码:

      void pac()
      {
          int i;
          int j;
          int k;
          int size;
      
          char *ns;
          int  *nss;
      
          printf("ENTER THE NUMBER OF STUDENTS: ");
          scanf("%d",&size);
      
          /* Check size */
      
          if (size > 0)
          {
              ns  = (char *)malloc(size * sizeof(char));
              nss = (int *)malloc(size * sizeof(int));
      
              /* check ns and nss are not NULL and then continue */
      
              for(i = 0; i < size; i++)
              {
                  printf("ENTER THE NAME OF STUDENT: ");
                  scanf("%c",&ns[i]);
              }
      
              for(j = 0; j < size; j++)
              {
                  printf("ENTER THE MARKS OF THE STUDENT: ");
                  scanf("%d", &nss[j]);
              }
      
      
              for(k = 0;k < size; k++)
              {
                  printf("%c", ns[i]);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-08-30
        • 2019-01-14
        • 2017-02-18
        • 2020-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        相关资源
        最近更新 更多