以下代码中的问题是否与指针数组的内存分配有关?

Is the problem in the below code related to memory allocation for array of pointers?

在下面的代码中,我尝试使用函数 usergetline 从 STDIN 读取输入行,在主函数中,我将输入字符串分配给一个 char 指针数组。 (char *lineptr[MAXCOUNTLINE])

虽然在第一个 while 循环中,输入行存储在 lineptr 中(正如我打印 lineptr[iplinecount] 时所见),但是,一旦我走出循环,它打印的只是新行.

#include <stdio.h>
#include <string.h>

/* function declarations */
int usergetline(char *, int);

/* constants */
#define MAXCOUNTLINE 10
#define MAXLINECOUNTWIDTH 100
#define DEFPRINTFRLASTCOUNT 8

void main(int argc, char *argv[])
{
    char *ipline;
    int iplinecount,shifter;
    iplinecount=0;
    char *lineptr[MAXCOUNTLINE];
    /* continue to accept the lines till the time EOF is not encountered and 
     * max count of lines is not exceeded */
    while((iplinecount < MAXCOUNTLINE) && (usergetline(ipline,MAXLINECOUNTWIDTH) >0)){
        lineptr[iplinecount] = ipline;
        #ifdef DEBUG
        printf("iplinecount: %d\n",iplinecount);
        printf("ipline: %s\n",ipline);
        printf("strlen of ipline: %d\n",strlen(ipline));
        printf("*(lineptr+iplinecount): %s\n",lineptr[iplinecount]);
        printf("strlen of *(lineptr+iplinecount): %d\n",strlen(lineptr[iplinecount]));
        printf("value at ipline %p\n",ipline);
        printf("value at *(lineptr+iplinecount) %p\n",lineptr[iplinecount]);
        #endif
        iplinecount++;
    }
    printf("iplinecount = %d\n",iplinecount);
    shifter=0;   
    while(shifter < iplinecount){
        printf("strlen: %d\n",strlen(*(lineptr+shifter)));
        printf("%s\n",*(lineptr+shifter));
        shifter++;
    }
}

/* usergetline: function to accpet an input line from STDIN */
int usergetline(char *ipline, int maxlengthofip)
{
    char c;
    int i=0;
    while((maxlengthofip-1) && ((c=getchar()) != EOF) && (c != '\n')){
        maxlengthofip--;
        *ipline=c;
        ipline++;
        i++;
    }
    if (c=='\n'){
        *ipline='\n';
        ipline++;
        i++;
    }
    *ipline = '[=10=]';
    return i;
}

假设这个文件名为exercise5-13.c。 我正在使用 cygwin 环境。编译后(使用 -D DEBUG 标志),当我执行程序时,如../exercise5-13.exe 输出为:

testing
iplinecount: 0
ipline: testing

strlen of ipline: 8
lineptr[iplinecount]: testing

strlen of lineptr[iplinecount]: 8
value at ipline 0xffffcdf0
value at lineptr[iplinecount] 0xffffcdf0
iplinecount = 1
strlen=0

我对 char 指针数组初始化的有限理解和争论是,当我分配时(第 21 行)

''' lineptr[iplinecount] = ipline; '''

然后,lineptr 被分配了一个 ipline 地址,在这种情况下,它本身指向从 STDIN testing 获取的字符串常量。 我期望从 STDIN 获取的每个新字符串将首先存储在 line 指针中,并且从它们中,字符串的第一个元素的地址将存储在 char 指针数组中。但是,char指针数组是空的?

您正在使用未初始化的指针

char *ipline;

//...

usergetline(ipline,MAXLINECOUNTWIDTH)

在调用未定义行为的函数 usergetline 中。

您需要在要读取数据的位置动态分配内存,并将分配的内存地址分配给指针ipline。因此指针 ipline 必须通过引用传递给函数,即通过指向指针的指针。

本例中的函数声明类似于

int usergetline(char **ipline, int maxlengthofip);