【发布时间】:2021-05-23 11:35:37
【问题描述】:
我编写了一个程序,将输出目录名(argv[1])与文件名(char *output_files_basename[])合并:
algo.c:
#include <stdio.h>
#include <strings.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "algo.h"
#include "parameters.h"
char *output_files_basename[] = {
"test1",
"test2",
"test3",
"test4",
NULL
};
extern int errno;
int main(int argc, char *argv[]) {
char output_dir[MAX_PATH_LENGTH] = "";
char *output_files_fullpath[] = { NULL };
int ret = 0;
/* check parameters */
if (argc < 2) {
printf("Not enough parameters\n");
printf("Should be:\n");
printf("%s output_dir\n", argv[0]);
return EINVAL;
}
#if DEBUG > 0
printf("Arguments: \n");
printf("output_dir: %s\n", argv[1]);
#endif
strncpy(output_dir, argv[1], MAX_PATH_LENGTH - 1);
output_dir[MAX_PATH_LENGTH - 1] = '\0';
#if DEBUG > 0
printf("output_dir: %s\n", output_dir);
#endif
/* set full input file names */
form_fullpath(output_files_fullpath, output_files_basename, output_dir);
free_fullpath(output_files_fullpath);
return EXIT_SUCCESS;
}
algo.h:
#ifndef ALGO_H
#define ALGO_H
#define DEBUG 1
#define MAX_PATH_LENGTH 256
#endif /* ALGO_H */
parameters.h:
#ifndef PARAMETERS_H
#define PARAMETERS_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include "algo.h"
/* get input_dir and append to input_files_basename => input_files_fullpath */
void form_fullpath(char *input_files_fullpath[], char *input_files_basename[], char *input_dir);
/* free memory */
void free_fullpath(char *input_files_fullpath[]);
#endif /* PARAMETERS_H */
parameters.c:
#include "parameters.h"
extern int errno;
void form_fullpath(char *input_files_fullpath[], char *input_files_basename[], char *input_dir) {
int file_iter = 0;
char *strtmp = NULL;
for (file_iter = 0; input_files_basename[file_iter] != NULL && input_dir != NULL; file_iter++) {
//#ifdef TTT
input_files_fullpath[file_iter] = malloc(sizeof(char) *
(strlen(input_files_basename[file_iter]) +
strlen(input_dir) + 2) /* '/' and '\0' */);
//#endif
/*sprintf(input_files_fullpath[file_iter], "%s/%s%c",
input_dir,
input_files_basename[file_iter],
'\0');*/
#if DEBUG > 0
//printf("file_fullpath[%d]: %s\n", file_iter, input_files_fullpath[file_iter]);
printf("input_files_basename[%d]: %s\n", file_iter, input_files_basename[file_iter]);
printf("%d input_dir: %s\n", file_iter, input_dir);
#endif
}
input_files_fullpath[file_iter] = NULL;
}
void free_fullpath(char *input_files_fullpath[]) {
int file_iter = 0;
for (file_iter = 0; input_files_fullpath[file_iter] != NULL; file_iter++) {
free(input_files_fullpath[file_iter]);
}
}
当我在 form_fullpath 函数中评论 malloc 时,我有这个输出:
./algo output/
Arguments:
output_dir: output/
output_dir: output/
input_files_basename[0]: test1
0 input_dir: output/
input_files_basename[1]: test2
1 input_dir: output/
input_files_basename[2]: test3
2 input_dir: output/
input_files_basename[3]: test4
3 input_dir: output/
但是当我在 form_fullpath 函数中取消注释 malloc 时,我的输出如下:
./algo output/
Arguments:
output_dir: output/
output_dir: output/
input_files_basename[0]: test1
0 input_dir: output/
input_files_basename[1]: test2
1 input_dir: P
input_files_basename[2]: test3
2 input_dir: P
input_files_basename[3]: test4
3 input_dir: P
为什么malloc会重叠input_dir函数参数?如果有人能解释一下,我将不胜感激。
【问题讨论】:
-
char *output_files_fullpath[] = {NULL};output_files_fullpath有多少个元素?你打算写多少?