"segmentation fault"可能是由 C 语言中的内存分配发出的



在此代码中,我想找到句子中最长的单词 我停止了一个分段错误,我认为这是由于函数 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后结束。

相关内容

  • 没有找到相关文章

最新更新