指针有问题,无法在标题中解释

时间:2014-10-26 16:58:53

标签: c arrays pointers

当奖励lineptr[nlines++] = p时,在下一轮循环中lineptr[nlines++] = plineptr[--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}}

2 个答案:

答案 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++;

如果还不清楚,请告诉我。