在此代码中,我想找到句子中最长的单词 我停止了一个分段错误,我认为这是由于函数 longestEvenWord(( 中的内存分配将返回"res"变量;似乎 res 未正确分配。通过运行 gdb,我得到以下错误
Program received signal SIGSEGV, Segmentation fault.
_IO_vfprintf_internal (s=0x0, format=0x400d22 "%sn",
ap=ap@entry=0x7fffffffdca8) at vfprintf.c:1275
1275 vfprintf.c: No such file or directory.
这是代码
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* readline();
char* longestWord();
int main(){
FILE* fptr = fopen(getenv("OUTPUT_PATH"), "w");
char* sentence = readline();
char* res = longestWord(sentence);
fprintf(fptr, "%sn", res);
fclose(fptr);
return 0;
}
char* readline() {
size_t alloc_length = 1024;
size_t data_length = 0;
char* data = malloc(alloc_length);
while (true) {
char* cursor = data + data_length;
char* line = fgets(cursor, alloc_length - data_length, stdin);
if (!line){
break;
}
data_length += strlen(cursor);
if (data_length < alloc_length - 1 || data[data_length - 1] == 'n'){
break;
}
size_t new_length = alloc_length << 1;
data = realloc(data, new_length);
if (!data) { break; }
alloc_length = new_length;
}
if (data[data_length - 1] == 'n') {
data[data_length - 1] = ' ';
}
data = realloc(data, data_length);
return data;
}
char* longestWord(char* sentence) {
char res[134] = "00";
char word[134];
char s[134];
strcpy(s, sentence);
memset(word,0,strlen(word));
int l, c = 0, max = -1;
l = strlen(s);
for(int i = 0 ; i < l ; i++){
if(s[i] != ' '){
word[c]= s[i] ;
c++;
}else{
if(c > max) {
word[c+1]=' ';
max = c;
strcpy(res, word);
}
c = 0;
memset(word,0,strlen(word));
}
}
if(c > max) {
max = c;
strcpy(res, word);
}
return res;
}
这条线有可能是你的问题吗? FILE* fptr = fopen(getenv("OUTPUT_PATH"(, "w"(;
fopen 可能会失败,并且由于许多与内存损坏无关的原因返回 NULL。 也许在上面之后添加一行,例如:
if (fptr == NULL) { perror(“fopen failed”); exit(1); }
维基百科上有一篇文章,Dangling Pointer,很好地解释了你的代码问题。
简而言之,所有自动变量在从函数返回后都会失去内存控制。因此,不能假设您存储某些数据的地址将保持不变;例如,另一个函数可能已经覆盖了该位置。
您可以使用malloc
使res
动态化,并使用strcpy
初始化,如下所示。
char *res = (char *)malloc(134 * sizeof(char));
strcpy(res, "00");
确保在使用动态变量后释放它们,否则它们会导致内存泄漏,尽管在您的程序中这不会成为问题,因为它只是在打印res
后结束。