【发布时间】:2022-10-13 16:33:35
【问题描述】:
嗨,我正在尝试将未知数量的命令行参数存储到 c 中动态分配的字符串数组中。终端告诉我我有一个 segFault,我已经追踪到 strcpy 行(参见代码 1。)我尝试查看其他人的解决方案,但我仍然不确定我做错了什么,但我相信我有内存泄漏。
代码 1。
for (int j = fileLocCount+1; j < argc; j++){
strcpy(filelist.array[filelist.used], argv[j]);
filelist.used += 1;
if (filelist.used == filelist.size){
for (int i = 0; i < 100; i++)
insertArray(&filelist, i);
}
}
//printArray(&filelist);
freeArray(&filelist);
'filelist' 变量是一个名为 Array 的结构
typedef struct {
char **array;
size_t used;
size_t size;
} Array;
并具有功能
void initArray(Array *a, size_t initialSize) {
a->array = (char **) calloc(initialSize, 255);
a->used = 0;
a->size = initialSize;
}
void insertArray(Array *a, int element) {
// a->used is the number of used entries, because a->array[a->used++] updates a->used only *after* the array has been accessed.
// Therefore a->used can go up to a->size
if (a->used == a->size) {
a->size *= 2;
a->array = realloc(a->array, a->size * sizeof(int));
}
a->array[a->used++] = a->array[element];
}
void freeArray(Array *a) {
free(a->array);
a->array = NULL;
a->used = a->size = 0;
}
任何帮助都非常感谢
【问题讨论】:
-
calloc(initialSize, 255); ??? 255是什么
-
首先,请解释为什么你需要制作有问题的副本......命令行的字符串(argv [ x ])在程序执行期间不会去任何地方......
-
当
array定义为char**时,这个a->array = (char **) calloc(initialSize, 255);是错误的...元素大小必须与sizeof(char*)匹配。此外,您需要为字符串分配内存。或者,您可以将array设为指向 char 数组的指针。 -
realloc(a->array, a->size * sizeof(int));是错误的。您的数组包含char *元素,因此您需要realloc(a->array, a->size * sizeof(char *));如果您的指针大于您的整数,那么您将不会分配尽可能多的内存。段错误。如前所述,前面的calloc调用中的255是无稽之谈。 -
命令行参数已经存储在字符串数组中;它被称为
argv。将它与argc一起使用,几乎所有这些都是不必要的。