当奖励lineptr[nlines++] = p
时,在下一轮循环中lineptr[nlines++] = p
,lineptr[--nlines]
(lineptr[]
的元素,p
之前的一个元素lineptr[nlines++] = p
因为p改变了,他会改变吗?我尝试用简单的例子,用一些整数来尝试实现这一点,但它给了我不同的结果"?我在k& r book中找到了这个例子int readlines(char *lineptr[], int maxlines)
{
int len, nlines;
char *p, line[MAXLEN];
nlines = 0;
while ((len = getline(line, MAXLEN)) > 0)
if (nlines >= maxlines || (p = malloc(len)) == NULL)
return -1;
else {
line[len - 1] = '\0'; /* delete the newline */
strcpy(p, line);
lineptr[nlines++] = p;
}
return nlines;
}
。
{{1}}
答案 0 :(得分:4)
如果我理解正确,那么你问的是,在下一个循环传递中更改要使用的p
的值是否会修改在前一个传递中设置为p
值的数组元素。 ..答案是没有。分配每个数组元素时:
lineptr[nlines++] = p;
它将成为分配时p
具有的任何值的副本 ...更改p
(指针值)以后不会修改数组元件。如果您更改p
指向的内容而不更改p
本身,则情况会有所不同,因为数组元素仍会指向相同的数据。
答案 1 :(得分:3)
如果我理解正确,你基本上会问以下情况:
char *lineptr[];
char *p;
int nlines=0;
// first loop
p = malloc(len);
strcpy(p, line);
lineptr[nlines++] = p; // will assign lineptr[0]
// second loop
p = malloc(len);
strcpy(p, line);
lineptr[nlines++] = p; // will assign lineptr[1]
第二个循环不会改变lineptr
在第一个循环中分配的内容。
p
存储malloc()
的结果,它是指向某个内存的指针。每次调用malloc
都会指向不同的记忆。当您重新分配p
时,之前的值会丢失,因此它无法再更改之前指向的位置。 lineptr
永远不会指向p
,但在转让时它将是p
的副本。
我上面的例子也可以写成:
char *lineptr[];
int nlines=0;
// first loop
lineptr[nlines] = malloc(len); // will assign lineptr[0]
strcpy(lineptr[nlines], line);
nlines++;
// second loop
lineptr[nlines] = malloc(len); // will assign lineptr[1]
strcpy(lineptr[nlines], line);
nlines++;
如果还不清楚,请告诉我。