【问题标题】:C strcpy causing segmentation faultC strcpy 导致分段错误
【发布时间】:2013-12-07 06:53:23
【问题描述】:

我有这个结构:

typedef struct occurrenceType Occurrence;

struct occurrenceType {
char* line;
int lineNumber;
int wordNumber;
Occurrence *next;

};

我正在尝试用这样的方式创建一个链接列表:

inFile=fopen(argv[1],"r");
while(fgets(line,100,inFile)!=NULL) {
    if(strstr(line,argv[2])!='\0') {
            strcpy((*occur).line,line);
                (*occur).lineNumber=count;
                (*occur).next=(Occurrence*)malloc(sizeof(Occurrence));
                occur=(*occur).next;
        lineCount++;
    }
    count++;
}

该程序应该读取程序的行并搜索在命令行中指定的字符串。找到匹配项时,将出现一个事件添加到链接列表中。除了结构的“行”字段外,一切正常。使用strcpy填充时,会出现分段错误,但是

(*occur).line=line;

不是一个可行的选择,因为行指针在整个程序中都会发生变化。谁能建议另一种方法来做到这一点?谢谢!

【问题讨论】:

  • 写入前需要先分配line
  • @amdixon 我将如何正确地做到这一点?我之前试过了,没用。
  • 顺便说一句,occur->lineNumberoccur->next 是通过指针写入字段引用的更常见方式,而不是 (*occur).lineNumber(*occur).next
  • 另外,由于您使用malloc(),您的最后一个列表元素不会被初始化为任何有意义的状态。您可能希望显式初始化 occur->next = NULL 以及 occur = (*occur).next; 行之后的其他字段。

标签: c++ c


【解决方案1】:

您需要为行字段分配空间或使其成为实际的字符缓冲区。

如果您要分配,请将此行添加到块中 strcpy 的正上方:

    occur->line = calloc( 1, 100 );

【讨论】:

  • 似乎您只想分配线路需要的数量。非标准但很常见的strdup() 就是这样做的。
  • 同意,但我不确定他是想保留他阅读的整行还是只保留他找到的字符串。他的代码 sn-p 没有暗示这个事实,只是他正在读取一个长达 100 字节的字符串,然后试图将其保存。我会进一步向作者建议他在一些问题上工作以使代码更灵活,例如不使用硬编码大小,@Joe Z 关于压缩数据存储的评论等。
  • strcpy(occur->line, line) 将在最后的 ASCII NUL 处停止,因此分配超过 strlen(line) + 1 字节没有意义,是吗?
  • 啊,误读了您评论中的详细信息。是的,我同意你的观点。
猜你喜欢
  • 2018-07-28
  • 2011-11-22
  • 1970-01-01
  • 2014-10-21
  • 2013-02-23
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
相关资源
最近更新 更多