我写了一个程序,将输出目录名(argv[1]
(与文件名(char *output_files_basename[]
(合并:
算法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 parametersn");
printf("Should be:n");
printf("%s output_dirn", argv[0]);
return EINVAL;
}
#if DEBUG > 0
printf("Arguments: n");
printf("output_dir: %sn", argv[1]);
#endif
strncpy(output_dir, argv[1], MAX_PATH_LENGTH - 1);
output_dir[MAX_PATH_LENGTH - 1] = ' ';
#if DEBUG > 0
printf("output_dir: %sn", 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;
}
算法h:
#ifndef ALGO_H
#define ALGO_H
#define DEBUG 1
#define MAX_PATH_LENGTH 256
#endif /* ALGO_H */
参数.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 */
参数。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 ' ' */);
//#endif
/*sprintf(input_files_fullpath[file_iter], "%s/%s%c",
input_dir,
input_files_basename[file_iter],
' ');*/
#if DEBUG > 0
//printf("file_fullpath[%d]: %sn", file_iter, input_files_fullpath[file_iter]);
printf("input_files_basename[%d]: %sn", file_iter, input_files_basename[file_iter]);
printf("%d input_dir: %sn", 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
函数参数重叠?如果有人能解释我,我将不胜感激。
malloc为什么与input_dir函数参数重叠?
因为您的代码无效。阵列:
char *output_files_fullpath[] = {NULL};
只有一个元素,但您在form_fullpath
中以伪代码对其进行越界写入
int main() {
char *output_files_fullpath[] = {NULL};
form_fullpath(output_files_fullpath, ...)
}
void form_fullpath(char *input_files_fullpath[], ...) {
for (file_iter in 0 1 2 3) {
input_files_fullpath[file_iter] = something
}
}
input_files_fullpath
只有1个元素,而不是5个。您可以:
- 分配更多元素
char *output_files_fullpath[20];
- 例如使用动态分配来动态地重新分配每个循环的
output_files_fullpath
备注:
- 您可以使用
asprintf
来代替malloc+snprintf
` - 执行
sprintf(..., "%c", ' ')
毫无意义,会导致在字符串末尾写入两个零,我认为这也是一个错误,因为它会导致按字节越界写入内存。卸下' '
。sprintf
总是自己写入零终止字符 - 更喜欢使用
snprintf
- 我想,可以考虑使用较短的变量名吗?奇怪的是,
output_files_fullpath
在函数中变成了input_files_fullpath
,它仍然是输出的 - 考虑将
size_t
用于数组迭代器