gpt4 book ai didi

c - `fgets` 的内存管理

转载 作者:行者123 更新时间:2023-11-30 15:33:24 25 4
gpt4 key购买 nike

我想掌握C语言的内存管理。我已经开始使用Valgrind。这是我正在解决的第一个内存问题。

重要变量:

#define BUF_SIZE 1024
char buffer[BUFSIZ];
char *parsed;

这是分词器:

char **tokenize(char *buffer) {                                              
parsed = malloc(sizeof(buffer)); // #286
tokens = (char**)malloc(sizeof(buffer));
if (buffer[0] == '\n'){
printf("What do you expect? Enter sumething!\n");
exit(0);
}
strcpy(parsed, buffer); // #292
free(buffer);
for (i=0; i < 2; i++){
if (!(((tok = strsep(&parsed, delimeter)) != NULL) && (tokens[i] = tok)))
exit(0);
}
return tokens;
}

分词器的使用:

while (fgets(buffer, BUFSIZ, stdin)) {
tokens = tokenize(buffer); // #303

Valgrind 回溯:

Invalid write of size 1
at 0x4C2BFFC: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
by 0x4014BF: tokenize (B_tree.c:292)
by 0x40156B: main (B_tree.c:303)
Address 0x51f2048 is 0 bytes after a block of size 8 alloc'd
at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
by 0x401472: tokenize (B_tree.c:286)
by 0x40156B: main (B_tree.c:303)

重要行具有带有原始行号的注释,用于回溯。

缓冲区肯定大于传入其中的值。那里的常见问题是什么?怎么解决?

最佳答案

你有两个名为buffer的变量。一种是全局变量buffer[BUFSIZ]。另一个是函数参数char *buffer。请注意,函数参数优先于全局变量,因此 sizeof(buffer)sizeof(char *)

关于c - `fgets` 的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23719717/

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