strcpy 段错误将文件内容复制到数组
strcpy segfault copying file content to array
这是我的代码
char url[MAX_WORD + 1];
char *urls[MAX_WORD + 1];
//char word[MAX_WORD + 1];
while(fscanf(fp, "%100s", url) == 1) {
strcpy(urls[index], url);
index++;
}
这是我在 valgrind 上遇到的错误:
==43177== Process terminating with default action of signal 11 (SIGSEGV)
==43177== Access not within mapped region at address 0x4844000
==43177== at 0x4838DC8: strcpy (vg_replace_strmem.c:512)
==43177== by 0x109898: generateInvertedIndex (invertedIndex.c:102)
==43177== by 0x1092B4: test1 (testInvertedIndex.c:36)
==43177== by 0x109244: main (testInvertedIndex.c:23)
这是它从中复制的文件的内容
nasa.txt
news1.txt
file11.txt
mixed.txt
planets.txt
file21.txt
info31.txt
我不知道我是怎么得到这个错误的。我只想将文件的内容复制到一个 Urls 数组中。但是没用。
如果数组是在文件范围内声明的,则您有一个未初始化指针或空指针数组
char *urls[MAX_WORD + 1];
所以这个电话
strcpy(urls[index], url);
调用未定义的行为。
看来您需要声明一个 two-dimensional 数组,例如
char urls[MAX_WORD + 1][MAX_WORD + 1];
或者在原始数组中为存储的字符串动态分配内存。像
urls[index] = malloc( strlen( url ) + 1 );
if ( urls[index] != NULL ) strcpy(urls[index], url);
else /* some error processing */;
这是我的代码
char url[MAX_WORD + 1];
char *urls[MAX_WORD + 1];
//char word[MAX_WORD + 1];
while(fscanf(fp, "%100s", url) == 1) {
strcpy(urls[index], url);
index++;
}
这是我在 valgrind 上遇到的错误:
==43177== Process terminating with default action of signal 11 (SIGSEGV) ==43177== Access not within mapped region at address 0x4844000 ==43177== at 0x4838DC8: strcpy (vg_replace_strmem.c:512) ==43177== by 0x109898: generateInvertedIndex (invertedIndex.c:102) ==43177== by 0x1092B4: test1 (testInvertedIndex.c:36) ==43177== by 0x109244: main (testInvertedIndex.c:23)
这是它从中复制的文件的内容
nasa.txt news1.txt file11.txt mixed.txt planets.txt file21.txt info31.txt
我不知道我是怎么得到这个错误的。我只想将文件的内容复制到一个 Urls 数组中。但是没用。
如果数组是在文件范围内声明的,则您有一个未初始化指针或空指针数组
char *urls[MAX_WORD + 1];
所以这个电话
strcpy(urls[index], url);
调用未定义的行为。
看来您需要声明一个 two-dimensional 数组,例如
char urls[MAX_WORD + 1][MAX_WORD + 1];
或者在原始数组中为存储的字符串动态分配内存。像
urls[index] = malloc( strlen( url ) + 1 );
if ( urls[index] != NULL ) strcpy(urls[index], url);
else /* some error processing */;