gpt4 book ai didi

c - 使用gdb--仍然找不到malloc错误

转载 作者:行者123 更新时间:2023-11-30 14:52:47 25 4
gpt4 key购买 nike

我看过以前关于这个的帖子,他们没有帮助我找到我的问题......为了保持简短,我正在制作一个函数应该逐行读取文本文件(是的,我确实意识到这样的帖子还有很多)。但是当我通过 CMD 运行我的程序时,它给了我这个错误:

Program received signal SIGSEGV, Segmentation fault.
__GI___libc_realloc (oldmem=0x10011, bytes=1) at malloc.c:2999
2999 malloc.c: No such file or directory.

相当确信我正确地写出了我的malloc/realloc行。我尝试找到很多与此类似的帖子,但所提供的解决方案都没有帮助。如果您有任何我可能错过的帖子建议,请告诉我。无论如何,这是我的功能:

char* read_single_line(FILE* fp){
char* line = NULL;
int num_chars = 0;
char c;
fscanf(fp, "%c", &c);
while(!feof(fp)) {
num_chars++;
line = (char*) realloc(line, num_chars * sizeof(char));
line[num_chars -1] = c;
if (c == '\n') {
break;
}
fscanf(fp, "%c", &c);
}
if(line != NULL) {
line = realloc(line, (num_chars+1) * sizeof(char));
line[num_chars] = '\0';
}
return line;
}


void read_lines(FILE* fp, char*** lines, int* num_lines) {
int i = 0;
int num_lines_in_file = 0;
char line[1000];
if (fp == NULL) {
*lines = NULL;
*num_lines = 0;
} else {
(*lines) = (char**)malloc(1 * sizeof(char*));
while (read_single_line(fp) != NULL) {
(*lines)[i] = (char*)realloc((*lines)[i], sizeof(char));
num_lines_in_file++;
i++;
}
*lines[i] = line;
*num_lines = num_lines_in_file;

}
}

我真的很感激任何帮助——我是 C 初学者,所以听我说!!

最佳答案

char line[1000];
:
while (read_single_line(fp) != NULL) {
:
}
*lines[i] = line;

这对我来说看起来不太好。您的 read_single_line 函数返回一个实际的行,但除了检查 NULL 之外,您实际上从未将其存储在任何地方。相反,您将行指针指向 line,这是一个自 Action 用域的变量,它实际上可以包含任何内容(更令人担忧的是,可能没有终止符)。

我认为您应该存储 read_single_line 的返回值并使用它来设置行指针。

<小时/>

顺便说一句,一次扩展一个字符的缓冲区也可能效率很低。我建议首先分配更多字节,然后保留该容量和当前使用的字节。然后,只有当你要使用超出你的能力的时候,你才会扩张,而且扩张不止一处。在伪代码中,类似于:

def getLine:
# Initial allocation with error check.

capacity = 64
inUse = 0
buffer = allocate(capacity)
if buffer == null:
return null

# Process each character made available somehow.

while ch = getNextChar:
# Expand buffer if needed, always have room for terminator.

if inUse + 1 == capacity:
capacity += 64
newBuff = realloc buffer with capacity

# Failure means we have to release old buffer.

if newBuff == null:
free buffer
return null

# Store character in buffer, we have enough room.

buffer[inUse++] = ch

# Store terminator, we'll always have room.

buffer[inUse] = '\0';
return buffer

您会注意到,除了更有效的重新分配之外,还可以对所述分配进行更好的错误检查。

关于c - 使用gdb--仍然找不到malloc错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47565901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com