尝试在C中学习正确的内存处理——malloc、realloc和free



所以我有两个问题(希望很快)。我想我已经掌握了使用malloc来节省数据空间的窍门,但realloc正在制造麻烦。在下面的代码中,我有一个由8个字符指针组成的数组,如果它填满了,我将尝试扩展到有另一个8个字符的指针(然后是另一个8,依此类推)。Realloc第一次这样做(即,它将扩展数组一次),但之后我得到以下错误:

*** glibc detected *** ./a.out: realloc(): invalid next size:

据我所知,一切都没有改变。为什么realloc对8的数组有效,而对16的数组无效?

我的第二个问题是关于内存泄漏。我仍然不确定我需要在程序中释放什么。其他人建议我需要释放inputcpy。就这些吗?另外,我想在程序的什么时候释放它?

#define DEBUG 1
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
char ** getArgs( char *input,  char **args, int ct);
char ** args;
int main(int argc, char* argv[]) {
  char input[]="echo arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 arg11 arg12 arg13";
  char inputcpy[strlen(input)];
  strcpy(inputcpy, input);
  char * prog=strtok(input, " ");
  /*Saving space for an array of 8 strings*/
  args=( char **) calloc(8, sizeof( char *));  
  getArgs(inputcpy, args, 1);
  if(DEBUG) {
    printf("arg address after: %pn", args);
  }
  int q;
  int pid=fork();
  if (pid==0) {
    execvp(prog, args); 
    return 0;
  }
  else {
    int status=0;
    wait(&status);
  }
}
char ** getArgs( char *input,  char **args, int ct) {
  int adj=(ct-1)*8;//if we recurse, this ensures correct indexes are used
  char *inputcpy=malloc(strlen(input));
  strcpy(inputcpy, input);
  /*Initialize indexes/Prepare for copying*/
  int i; 
  if(ct==1) {
    i=1;
    args[0]=" "; //quick hack to ensure all args are used by exec()
  }
  else
    i=0;
  /**Actually do the copying now**/
  char *temp=strtok(NULL, " ");
  args[adj+i++]=temp;
  while (temp != NULL && i<8) {
    temp=strtok(NULL, " ");
    args[adj+i++]=temp;
  }   
  /*If there are more args than we have room for*/
  if(i>=8){
    /*Increase the array to store 8 more strings*/
    args= (char **) realloc(args, sizeof(args)+8*sizeof(char *) );
    getArgs(inputcpy, args, (++ct) );
  }   
  return NULL;
}
 char *inputcpy=malloc(strlen(input));
 strcpy(inputcpy, input);

您没有为字符串分配足够的空间,应该是:malloc(strlen(input) + 1);

此处相同:

 char inputcpy[strlen(input)];
 strcpy(inputcpy, input);

字符串是一系列以null字符结尾的字符,字符串的长度是null字符前面的字符数。

此外,您使用realloc不正确:

args= (char **) realloc(args, sizeof(args)+8*sizeof(char *) );

此使用中可能存在内存泄漏。

关于free,您应该做的很简单:每个malloc都应该有一个相应的free

我会回答你的最后一个问题,它是:另外,我想在程序的什么时候释放它?

好吧,建议您在malloc函数的返回雄蕊之前将其释放。如果你这样做,你就不必担心以后会发生内存泄漏。

然而,在main的情况下,当getArgs()函数完成并将控制权返回给main时,调用函数也可以调用free()。这是因为在free()中使用不同的指针变量是可以的;您只需要确保新指针存储相同的地址。

相关内容

  • 没有找到相关文章

最新更新