以下代码中的问题是否与指针数组的内存分配有关?
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);
在下面的代码中,我尝试使用函数 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);