使用堆内存调试c

时间:2014-01-03 13:01:30

标签: c linux debugging heap

我正在使用堆内存,我在下面写了一个例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]){
  FILE *fd;

  //Alocate memory on the heap;
  char *UserInput = malloc(20);
  char *OutputFile = malloc(20);

  if(argc < 2){
    printf("Usage: %s <string to be written to /tmp/notes>\n", argv[0]);
    exit(0);
  }

  //Copy data into the heap memory
  strcpy(OutputFile, "/tmp/notes");
  strcpy(UserInput, argv[1]);

  //Print out some debug messages
  printf("___DEBUG___\n");
  printf("[*] UserInput @ %p: %s\n", UserInput, UserInput);
  printf("[*] OutputFile @ %p: %s\n", OutputFile, OutputFile);
  printf("[*] Distance between: %ld\n", UserInput - OutputFile);
  printf("_________________\n\n");

  //Writing the data out to the file
  printf("Writing to \"%s\" to the end of %s...\n", UserInput, OutputFile);
  fd = fopen(OutputFile, "a");
  if (fd == NULL){
    fprintf(stderr, "Error openning %s\n", OutputFile);
    exit(1);
  }

  fprintf(fd, "%s\n", UserInput);
  fclose(fd);

  return 0;
}

我执行的是:./ heap test 输出是:

___DEBUG___
[*] UserInput @ 0x1a13010: test
[*] OutputFile @ 0x1a13030: /tmp/notes
[*] Distance between: -32
_________________

我觉得“距离”之间出现了一些错误 int类型中argv[1]的最大长度为“31”的整数\\ char类型中{和1}的最大长度为“58”字符\\ 例如:

argv[1]

之后我面临一个开放的错误...... 为什么-32会发生距离?

2 个答案:

答案 0 :(得分:1)

这里没有错。指针由malloc()函数指定,它可以并且确实为指针分配相当任意的值。正常的malloc()实现将保留几个字节来标记分配的缓冲区的长度,以及利用空闲列表上的现有缓冲区大小。因此,如果您像往常一样分配两个缓冲区,则没有任何内容表明它们必须在堆空间中是连续的。事实上,他们不会。

我不知道你在这里要做什么,但是'两个malloc()指针之间的距离不会是缓冲区的确切长度。

答案 1 :(得分:0)

Malloc从不为后续请求分配连续的内存。 这取决于当前的空闲记忆状况。

作为一个很好的编程习惯,请在现有程序之前释放malloc分配,即在返回0语句之前。

free(OutputFile);
free(UserInput);
return 0;