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

时间:2015-03-08 06:01:11

标签: c arrays pointers

以下代码崩溃,如果我给这里的指针数组是否有任何其他方式通过指针数组接受值或者我在这里做了一些错误

编译后运行此程序应该键入 objectname -numberoflines

  //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 个答案:

答案 0 :(得分:1)

主要问题是你写的时候

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数组的数组,其内存在堆栈中自动分配。