gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:44 25 4
gpt4 key购买 nike

所以我有两个(希望很快)问题。我想我已经掌握了使用 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: %p\n", 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);

字符串是终止的字符序列,包括空字符,字符串的长度是空字符之前的字符数。

此外,您还错误地使用了 realloc:

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

此使用中存在潜在的内存泄漏。

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

关于c - 尝试在 C 中学习正确的内存处理——malloc、realloc 和 free,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9455230/

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