创建一个动态字符串数组,该数组将在填满时缩放
Create a dynamic array of strings that will scale upon being filled up
好的,所以我正在读取一个 txt 文件并将每个项目按新行存储到一个字符串数组中。唯一的问题是,每当它快要填满时,我需要将这个数组的大小调整为 5。
输入看起来像这样,但要大得多
CSE 1104
CSE 1105
CSE 1310
CSE 2320
IE 2308
PHYS 1443
MATH 1426
这是我的代码
void printFileError(char *s) {
printf("unable to open %s\n", s);
exit(1);
}
void reallocTaken(char **taken, int *size, int newSize) {
(*size) = newSize;
taken = realloc(taken, (*size) * sizeof(char *));
printf("Realocateding---- \n");
}
int main(int argc, char *argv[]) {
char **coursesTaken;
int coursesTakenSize = 5;
int i;
char *filePlan, *fileMyCourses;
FILE *fp;
/* Open the file of completed courses */
if((fp = fopen(argv[2], "r")) != NULL) {
char buffer[255];
int lineCount = 0;
coursesTaken = malloc(sizeof(char *) * coursesTakenSize);
while(fgets(buffer, sizeof(buffer), fp) != NULL) {
char token[] = "\n";
char *split = strtok(buffer, token);
while(split != NULL) {
/* Check if array is full */
if((lineCount + 1) == coursesTakenSize) {
printf("Needs to allocate \n");
/* Realoc Memory */
reallocTaken(coursesTaken, &coursesTakenSize, coursesTakenSize + 5);
}
coursesTaken[lineCount] = malloc((sizeof(split) + 1) * sizeof(char));
strcpy(coursesTaken[lineCount], split);
printf("%s\n", split);
lineCount++;
split = strtok(NULL, token);
}
}
/* Cut out exessive memory */
reallocTaken(coursesTaken, &coursesTakenSize, lineCount);
printf("Line Count: %d\n", lineCount);
printf("Size: %d\n", coursesTakenSize);
printf("Final Size: %lu\n", sizeof(coursesTaken));
fclose(fp);
} else {
printFileError(argv[2]);
}
for(i = 0; i < coursesTakenSize; i++) {
printf("%d:\t%s\n", i+1, coursesTaken[i]);
}
return 0;
}
这里的计划是
首先分配 5 个内存插槽,当行数等于大小时,再向其添加 5 个插槽。文件完成后,将整个文件的大小调整为行数。同时,分配数组的每个索引,用文本文件中的数据填充它。
代码成功重新分配前两个块,然后给出错误
a.out(9410,0x7fff7f20a300) malloc: *** error for object 0x7fcb9b404bb0: pointer being realloc'd was not allocated
这发生在这里
CSE 1104
CSE 1105
CSE 1310
CSE 2320
Needs to allocate
Realocateding----
IE 2308
PHYS 1443
MATH 1426
MATH 1302
MATH 1323
Needs to allocate
我通过评论 coursesTaken[lineCount] = malloc((sizeof(split) + 1) * sizeof(char))
注意到程序在打印每个
时完全运行直到结束
我不太确定这里发生了什么。
您混淆了 sizeof
和 sizeof
之间的混淆,后者可以给出单个元素、结构或 已知大小的数组的大小 ,以及strlen
给出空终止字符串的长度。
coursesTaken[lineCount] = malloc((sizeof(split) + 1) * sizeof(char))
行确实是罪魁祸首。正如在下一行中将 split
复制到其中一样,您需要它可以包含拆分中的所有字符以及终止空值。
但由于 split
是 char *
,sizeof(split)
是 指针的大小 (例如 4 在 32位系统,64 位系统上有 8 个)。
你应该写这行:
coursesTaken[lineCount] = malloc((strlen(split) + 1) * sizeof(char));
你想要:
void reallocTaken(char ***taken, int *size, int newSize) {
(*size) = newSize;
*taken = realloc(*taken, (*size) * sizeof(char *));
printf("Realocateding---- \n");
}
并这样称呼它:
reallocTaken(&coursesTaken, &coursesTakenSize, coursesTakenSize + 5);
在您的原始代码中,您丢失了指向重新分配的 space 的指针,方法是将其分配给 taken
而不是 *taken
,而是继续使用指向原始代码的指针,那时释放了,space。原理和你正确应用于courseTakenSize
.
的一样
当您再次尝试重新分配该原始指针时,您报告的错误随之而来。
好的,所以我正在读取一个 txt 文件并将每个项目按新行存储到一个字符串数组中。唯一的问题是,每当它快要填满时,我需要将这个数组的大小调整为 5。
输入看起来像这样,但要大得多
CSE 1104
CSE 1105
CSE 1310
CSE 2320
IE 2308
PHYS 1443
MATH 1426
这是我的代码
void printFileError(char *s) {
printf("unable to open %s\n", s);
exit(1);
}
void reallocTaken(char **taken, int *size, int newSize) {
(*size) = newSize;
taken = realloc(taken, (*size) * sizeof(char *));
printf("Realocateding---- \n");
}
int main(int argc, char *argv[]) {
char **coursesTaken;
int coursesTakenSize = 5;
int i;
char *filePlan, *fileMyCourses;
FILE *fp;
/* Open the file of completed courses */
if((fp = fopen(argv[2], "r")) != NULL) {
char buffer[255];
int lineCount = 0;
coursesTaken = malloc(sizeof(char *) * coursesTakenSize);
while(fgets(buffer, sizeof(buffer), fp) != NULL) {
char token[] = "\n";
char *split = strtok(buffer, token);
while(split != NULL) {
/* Check if array is full */
if((lineCount + 1) == coursesTakenSize) {
printf("Needs to allocate \n");
/* Realoc Memory */
reallocTaken(coursesTaken, &coursesTakenSize, coursesTakenSize + 5);
}
coursesTaken[lineCount] = malloc((sizeof(split) + 1) * sizeof(char));
strcpy(coursesTaken[lineCount], split);
printf("%s\n", split);
lineCount++;
split = strtok(NULL, token);
}
}
/* Cut out exessive memory */
reallocTaken(coursesTaken, &coursesTakenSize, lineCount);
printf("Line Count: %d\n", lineCount);
printf("Size: %d\n", coursesTakenSize);
printf("Final Size: %lu\n", sizeof(coursesTaken));
fclose(fp);
} else {
printFileError(argv[2]);
}
for(i = 0; i < coursesTakenSize; i++) {
printf("%d:\t%s\n", i+1, coursesTaken[i]);
}
return 0;
}
这里的计划是 首先分配 5 个内存插槽,当行数等于大小时,再向其添加 5 个插槽。文件完成后,将整个文件的大小调整为行数。同时,分配数组的每个索引,用文本文件中的数据填充它。
代码成功重新分配前两个块,然后给出错误
a.out(9410,0x7fff7f20a300) malloc: *** error for object 0x7fcb9b404bb0: pointer being realloc'd was not allocated
这发生在这里
CSE 1104
CSE 1105
CSE 1310
CSE 2320
Needs to allocate
Realocateding----
IE 2308
PHYS 1443
MATH 1426
MATH 1302
MATH 1323
Needs to allocate
我通过评论 coursesTaken[lineCount] = malloc((sizeof(split) + 1) * sizeof(char))
注意到程序在打印每个
我不太确定这里发生了什么。
您混淆了 sizeof
和 sizeof
之间的混淆,后者可以给出单个元素、结构或 已知大小的数组的大小 ,以及strlen
给出空终止字符串的长度。
coursesTaken[lineCount] = malloc((sizeof(split) + 1) * sizeof(char))
行确实是罪魁祸首。正如在下一行中将 split
复制到其中一样,您需要它可以包含拆分中的所有字符以及终止空值。
但由于 split
是 char *
,sizeof(split)
是 指针的大小 (例如 4 在 32位系统,64 位系统上有 8 个)。
你应该写这行:
coursesTaken[lineCount] = malloc((strlen(split) + 1) * sizeof(char));
你想要:
void reallocTaken(char ***taken, int *size, int newSize) {
(*size) = newSize;
*taken = realloc(*taken, (*size) * sizeof(char *));
printf("Realocateding---- \n");
}
并这样称呼它:
reallocTaken(&coursesTaken, &coursesTakenSize, coursesTakenSize + 5);
在您的原始代码中,您丢失了指向重新分配的 space 的指针,方法是将其分配给 taken
而不是 *taken
,而是继续使用指向原始代码的指针,那时释放了,space。原理和你正确应用于courseTakenSize
.
当您再次尝试重新分配该原始指针时,您报告的错误随之而来。