Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 导致分段故障的C strcpy_C++_C - Fatal编程技术网

C++ 导致分段故障的C strcpy

C++ 导致分段故障的C strcpy,c++,c,C++,C,我有这个结构: 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

我有这个结构:

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++;
}
程序应该读取程序的行并搜索命令行中指定的字符串。找到匹配项后,将向链接列表中添加一个匹配项。除了结构的“line”字段外,所有内容都正常工作。使用strcpy填充时,会出现分段错误,但是

(*occur).line=line;

是不可行的选项,因为行指针在整个程序中都会发生变化。有人能提出另一种方法吗?谢谢

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

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

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

写入前需要先分配
it@amdixon我怎样才能正确地做到这一点?我以前试过,但没用。顺便说一句,
occure->lineNumber
occure->next
是通过指针写入字段引用的更常见的方法,而不是
(*occure)。lineNumber
(*occure)。next
。另外,由于使用了
malloc()
,因此,您的最后一个列表元素将不会初始化为任何有意义的状态。您可能希望显式初始化
occure->next=NULL
以及在显示
occure=(*occure)的行之后的其他字段。似乎您只希望分配行所需的数量。非标准但非常常见的strdup()
就是这样做的。同意,但我不确定他是想保留他读的整行还是找到的字符串。他的代码片段并不表明这一事实,只是他正在读取一个最大为100字节的字符串,然后试图保存它。我进一步建议作者解决一些问题,使代码更加灵活,例如不使用硬编码大小,@Joe Z关于压缩数据存储的评论,等等。
strcpy(发生->行,行)
将在结尾处停留在ASCII NUL,因此分配的字节数不能超过
strlen(行)+1,有吗?啊,误读了你评论中的细节。是的,在那一点上我同意你。