代码之家  ›  专栏  ›  技术社区  ›  kapil effeffe

使用指针数组而不是二维数组时出错

  •  -1
  • kapil effeffe  · 技术社区  · 11 年前

    如果我在这里给出了指针数组,下面的代码就会崩溃。有没有其他方法可以通过指针数组接受值,或者我在这里做错了什么

    编译后运行此程序,您应该键入 objectname-行数

      //program to print first n lines of string using command  line arguement
    #include<stdio.h>
    #include<ctype.h>
    #include<stdlib.h>
    #include<string.h>
    int less(int x,int y);`enter code here`
    int main(int argc,char* argv[])
     {
         int i,j,n,num;
        char *lines[100];/*if I use two dimensional array here the code compiles
        char nu[6];
    
     // the whole for loop is for checking error in n
        for(i=1,n=strlen(argv[1]);i<n;i++)
        {
                if(argv[1][i]=='.')
                {
                        printf("your input was not correct \n");
                        return 0;
                }
                if(argv[1][i]=='-')
                {
                        printf("your input was not correct \n");
                        return 0;
                }
                if(isalpha(argv[1][i])!=0)
                {
                    printf("your input was not correct indeed");
                    return 0;
                }
        }
        printf("\t\t application to print number of last n lines \n\n\n");
        printf("enter the number of lines\n");
        scanf("%d",&n);
        printf("enter your lines \n");
        for(j=0;(n<100)&&(j<=n);j++)
        {
                gets(lines[j]);
        }
        strcpy(nu,argv[1]);
        nu[0]=' ';
        num=atoi(nu);
        num=(less(num,n));
        for(i=0;i<=num;i++)
        {
                printf("%s",lines[i]);
        }
        return 0;
    }
    int less(int x,int y)
    {
        int z;
        return (z=(x>y?y,printf("your input lines are less\n"):x));
    }
    
    1 回复  |  直到 11 年前
        1
  •  1
  •   Spikatrix    11 年前

    主要问题是当你写

    char *lines[100];
    

    创建一个100的数组 char* 指针。这些指针没有分配给它们的内存,它们指向一个随机位置。写入该位置(使用 gets 在程序中)调用未定义的行为。

    要解决此问题,请使用

    for(i=0 ; i<100 ; i++)
        lines[i]=malloc(AMOUNT_OF_BYTES_TO_ALLOCATE);
    

    稍后,在使用结束后,使用

    for(i=0 ; i<100 ; i++)
        free(lines[i]);
    

    当您使用二维数组时,它之所以有效,是因为您创建了一个数组数组 char 在堆栈中自动为其分配内存。