【问题标题】:if (* ptr)[variable] means "pointer to an array", what does mean (* ptr)[variable] = '\0'?如果 (* ptr)[variable] 表示“指向数组的指针”,那么 (* ptr)[variable] = '\0' 是什么意思?
【发布时间】:2022-01-08 06:55:32
【问题描述】:

下面的代码以下列方式工作:它基本上使用名为_getchar 的函数从stdin 读取每个字符,将它们分配到一个数组中,如果c =! EOF 最终返回它。

我只想知道下面代码中的(*lineptr)[n_read] = '\0'; 语句在做什么:

#include <unistd.h>
#include <stdlib.h>

int _getchar(void)
{
    int rd;
    char buff[2];

    rd = read(STDIN_FILENO, buff, 1);

    if (rd == 0)
        return (EOF);
    if (rd == -1)
        exit(99);

    return (*buff);
}

ssize_t _getline(char **lineptr, size_t *n, FILE *stream)
{
    char *temp;
    const size_t n_alloc = 120;
    size_t n_read = 0;
    size_t n_realloc;
    int c;

    if (lineptr == NULL || n == NULL || stream == NULL)
        return (-1);

    if (*lineptr == NULL)
    {
        *lineptr = malloc(n_alloc);
        if (*lineptr == NULL)
            return (-1);
        *n = n_alloc;
    }
    while ((c = _getchar()) != EOF)
    {
        if (n_read >= *n)
        {
            n_realloc = *n + n_alloc;
            temp = realloc(*lineptr, n_realloc + 1);

            if (temp == NULL)
                return (-1);

            *lineptr = temp;
            *n = n_realloc;
        }
        n_read++;
        (*lineptr)[n_read - 1] = (char) c;

        if (c == '\n')
            break;

    }
    if (c == EOF)
        return (-1);
    (*lineptr)[n_read] = '\0';
    return ((ssize_t) n_read);
}

【问题讨论】:

  • 如果ptr 是一个指针,那么*ptr 取消引用该指针,以获取它指向的对象。如果*ptr 是一个数组,则(*ptr)[i] 访问该数组的索引为i 的元素。
  • *ptr 总是与ptr[0] 完全相同。所以(*ptr)[i]ptr[0][i] 完全一样。
  • 那么,这是否意味着 (*lineptr)[n_read] = '\0'; null 会在最后一个位置终止 [n_read] 数组吗? @ElliottFrisch

标签: arrays c pointers getline getchar


【解决方案1】:

它们看起来相同但不同。

第一个:

int (*ptr)[something]; 

定义指向intsomething元素数组的指针

后者

(*ptr1)[something]   //witohut type in front of it.

表示解引用指针ptr1,然后用添加的something解引用先前解引用的结果。

它相当于

*((*ptr1) + something)

【讨论】:

  • 那么,这是否意味着(*lineptr)[n_read] = '\0'; 将在最后一个位置终止[n_read] 数组?
【解决方案2】:

char **lineptr 表示lineptr 包含char 指针的地址。

指针是一个包含地址的变量。所以写*lineptr你就得到了那个地址。

在你的情况下,**lineptr *(*lineptr) (*lineptr)[0]

编辑:顺便说一句,我没有回答这个问题...指令 (*lineptr)[n_read] = '\0' 表示您正在结束您的字符串('\0' 是 EOF(行尾)字符)。

【讨论】:

  • 没有。这意味着您分配零。 ptr 可以有任何类型,例如 uint64_t **double **。它不必是字符串。
  • 那么,这是否意味着(*lineptr)[n_read] = '\0'; 将在最后一个位置终止[n_read] 数组? @0_______
  • 不,它将在n_readlineptr引用的指针的字符元素处放置零
猜你喜欢
  • 2018-04-09
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2021-01-12
  • 2021-04-06
相关资源
最近更新 更多