c-函数中的堆与函数参数重叠

  • 本文关键字:函数 参数 重叠 c malloc
  • 更新时间 :
  • 英文 :


我写了一个程序,将输出目录名(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

为什么mallocinput_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用于数组迭代器

相关内容

  • 没有找到相关文章

最新更新