【问题标题】:Memory management with `fgets`使用`fgets`进行内存管理
【发布时间】:2014-05-18 07:46:35
【问题描述】:

我想掌握 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)

重要行有带有原始行号的 cmets,用于回溯。

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

【问题讨论】:

  • sizeof(buffer) == sizeof(char*).
  • 还有tokens = (char**)malloc(sizeof(buffer)); 错误。和free(buffer); 错了。

标签: c memory-management buffer valgrind fgets


【解决方案1】:

您有两个名为buffer 的变量。一个是全局变量buffer[BUFSIZ]。另一个是函数参数char *buffer。注意函数参数优先于全局变量,所以sizeof(buffer)就是sizeof(char *)

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多