我写了一个程序,它从命令行参数中读取一些文件名和一个单词。第一个参数将是一个单词,剩下的将是文件名。它填充了我定义的结构。然而,对于小参数,程序可以正常工作,但对于大参数,malloc
会给出损坏的最大大小错误。
以下只是程序的初始代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILENAME_LIM 256
#define WORD_LIM 256
struct data {
char filename[FILENAME_LIM];
char word[WORD_LIM];
};
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("usage: ./a.out word filename1 filename2 filename3 filename4 filename5 ...n");
exit(EXIT_FAILURE);
}
char word[WORD_LIM];
strcpy(word, argv[1]);
int files = argc - 2;
struct data *dataarray = (struct data *)malloc(sizeof(sizeof(struct data) * files));
if (!(dataarray)) {
perror("malloc");
exit(EXIT_FAILURE);
}
for (int i = 0; i < files; i++) {
strcpy(dataarray[i].filename, argv[i + 2]);
for (int ii = 0; ii < strlen(dataarray[i].filename) + 1; ii++) {
printf("filename[%d] = %c (%d), argv[%d] = %dn",
i, dataarray[i].filename[ii], dataarray[i].filename[ii],
i, argv[i + 2][ii]);
}
}
return 0;
}
我尝试了所有方法,但当我在argv
中给出一些大文件名(如"../../../C Programs/chess.c"
(时,malloc
会产生错误。我想知道是什么使损坏的顶部尺寸。
sizeof(struct data) * files
是有效的大小。任何一个尺寸的倍数都是一个尺寸。
sizeof(sizeof(struct data) * files)
就像说CCD_ 5。我不知道这意味着什么,很可能运行时也没有正常运行。
将sizeof(...)
的使用限制为处理类型参数。