分段错误(核心转储):简单程序但不工作

时间:2014-01-14 18:02:33

标签: c segmentation-fault

#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的新手,所以请让我知道这个错误。 在第一次输入学生数量后,此代码中存在分段错误。

4 个答案:

答案 0 :(得分: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];

答案 1 :(得分:0)

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

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

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

你也依赖于mainpac的隐式int,你应该明确设置它们的返回类型int main可能{{1} } void

你应该看到大多数这些警告,甚至不必打开它们。 pacgcc都会为隐式int 返回和clang的错误使用提供警告,类似于:

  

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

     

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

并出现警告也会让我发出警告:scanf已初始化:

  

警告:'size'在此函数中未初始化使用[-Wuninitialized]

答案 2 :(得分:0)

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

#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 :(得分:0)

这是所有答案的组合。

  1. 尺寸未初始化(已说明)

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

  3. 根据大小值动态分配空间,或者使用ns和nss修复足够的大小(#define MAX_SIZE 1000并检查大小&lt; MAX_SIZE)。

  4. 你可以这样编码:

    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]);
            }
        }
    }