以下是代码:
int makeargv(const char *s, const char *delimiters, char ***argvp) {
int error;
int i;
int numtokens;
const char *snew;
char *t;
if ((s == NULL) || (delimiters == NULL) || (argvp == NULL)) {
errno = EINVAL;
return -1;
}
*argvp = NULL;
snew = s + strspn(s, delimiters); /* snew is real start of string */
if ((t = malloc(strlen(snew) + 1)) == NULL)
return -1;
strcpy(t, snew);
numtokens = 0;
if (strtok(t, delimiters) != NULL) /* count the number of tokens in s */
for (numtokens = 1; strtok(NULL, delimiters) != NULL; numtokens++) ;
/* create argument array for ptrs to the tokens */
if ((*argvp = malloc((numtokens + 1)*sizeof(char *))) == NULL) {
error = errno;
free(t);
errno = error;
return -1;
}
/* insert pointers to tokens into the argument array */
if (numtokens == 0)
free(t);
else {
strcpy(t, snew);
**argvp = strtok(t, delimiters);
for (i = 1; i < numtokens; i++)
*((*argvp) + i) = strtok(NULL, delimiters);
}
*((*argvp) + numtokens) = NULL; /* put in final NULL pointer */
return numtokens;
}
int main(int argc, char *argv[]) {
char delim[] = " \t";
int i;
char **myargv;
int numtokens;
if (argc != 2) {
fprintf(stderr, "Usage: %s string\n", argv[0]);
return 1;
}
if ((numtokens = makeargv(argv[1], delim, &myargv)) == -1) {
fprintf(stderr, "Failed to construct an argument array for %s\n", argv[1]);
return 1;
}
printf("The argument array contains:\n");
for (i = 0; i < numtokens; i++)
printf("%d:%s\n", i, myargv[i]);
return 0;
}
答案 0 :(得分:1)
你好,这里是如何完全释放整个三维指针
#include <stdlib.h>
void my_free_t3d(char ***tab)
{
int second_pointer;
int first_pointer;
first_pointer = 0;
while (tab[first_pointer] != NULL)
{
second_pointer = 0;
while (tab[first_pointer][second_pointer] != NULL)
{
free(tab[first_pointer][second_pointer]);
second_pointer++;
}
free(tab[first_pointer]);
first_pointer++;
}
free(tab);
}
我将添加我用于malloc t3d的方式,以便我们可以看到这个自由函数背后的逻辑。
int main()
{
char ***tab;
int i = 0;
int j = 0;
//I don't check malloc return values just for the example so it's more clear.
tab = malloc(sizeof(char **) * 10);
while (i < 10)
{
j = 0;
tab[i] = malloc(sizeof(char *) * 10);
while (j < 10)
{
tab[i][j] = malloc(sizeof(char) * 10);
j++;
}
i++;
}
my_free_t3d(tab); //Here's our memory freeing function
return 0;
}
所以基本上我只是开始释放为字符串分配的空间(包含在tab **中)。然后我删除为2维指针(tab *)分配的空间,然后释放为3维指针(tab)分配的空间。
如果您不按该顺序释放并且您直接释放标签,例如,您将无法访问标签[I]或标签[I] [J],但仍会分配其内存。
希望它对你的计划有帮助。