【问题标题】:Writing to a character array that is a member of a struct写入作为结构成员的字符数组
【发布时间】:2010-02-18 01:59:51
【问题描述】:

这是我第一次在这里发布问题 - 我搜索了类似的问题,但没有找到。

这是我标题中的 sn-p:

#define LINE_LEN_MAX 256

typedef struct line_description {
    char buffer[LINE_LEN_MAX + 1];
    [...]
} line;

这是我主要功能的 sn-p:

int main(int argc, char *argv[]) {

    line *lineRead;

    //input: valid FILE *, read from cmdline
    //char buffer[LINE_LEN_MAX + 1];

    while(fgets(lineRead->buffer, LINE_LEN_MAX + 1, input) != NULL) {

        [...]

        memset(lineRead->buffer, 0, LINE_LEN_MAX + 1);
    }
}

我不断收到段错误。如果我注释掉“memset()”行,我可以在收到段错误之前从输入文件中准确读取 3 行。

但是,如果我用本地 char[] 替换 'lineRead->buffer',我就可以完美地读取我的输入文件。

我对这里的结构有什么不了解的地方?我想我想要的是一个指向结构内 char[] 开头的指针,但显然这不是正在发生的事情。

编辑:抱歉,忘了说明:我这里没有使用动态内存。

【问题讨论】:

  • 内存分配问题。 lineRead 从未被分配。

标签: c arrays struct segmentation-fault fgets


【解决方案1】:

你程序中的lineRead 是一个未初始化的指针,这可能不是你想要的。

您应该通过编写例如为一行分配一些存储空间。 line lineRead 相反,它将在堆栈上分配一个 line 结构。然后使用. 而不是-> 来访问其成员。

【讨论】:

  • +1 ,哇,实际上有人读到 OP 没有使用动态分配,只是提供了一个答案,而没有在 malloc() 上反复强调 :)
【解决方案2】:

也许你只是在你的 sn-p 中留下了一些东西,但你没有显示正在分配的结构。

line *lineRead; // uninitialized pointer: access to any field crashes
lineRead = (line*) malloc( sizeof( line_description ) );

或者,如果您不需要它在堆上(特别是考虑到main 中最外层范围内的堆栈对象无论如何都具有整个程序的生命周期),

line lineRead; // don't need to use a pointer!

【讨论】:

  • 是的,非常感谢 - 我这里没有使用动态内存。
【解决方案3】:

您将lineRead 声明为指向line 的指针,但实际上并未将其设置为指向任何内容。然后,当您尝试访问未初始化指针恰好指向的随机位置时,您会遇到分段错误。

如果您只需要在本地范围内使用lineRead,它不应该是指针,只需将其声明为

line lineRead;

如果lineRead 需要比函数更长的寿命,因此确实需要动态分配,请使用指针但也要为它应该指向的结构保留内存:

line *lineRead = malloc(sizeof(line));
lineRead->buffer[0] = '\0'; // or any other initializations...

【讨论】:

  • 谢谢,这正是问题所在。我只需要堆栈上的 lineRead。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 2017-06-11
  • 2021-07-12
  • 1970-01-01
  • 2021-12-09
相关资源
最近更新 更多