正在重新分配的指针未分配
pointer being realloced was not allocated
我正在尝试动态分配结构数组,但每当我 运行 程序时,我都会收到:a.out(6487,0x7fff7ecb8300) malloc: * 对象错误0x7fff6f670000: 重新分配的指针未分配
* 在 malloc_error_break 设置断点调试
struct node {
char course[25];
char category[20];
char prereq[50];
char notes[50];
};
int main(int argc, char* argv[])
{
FILE *fp;
char *filename = argv[1];
char *token;
char buffer[100];
char *del = ",\n";
int num = 5, i = 0, j =0, count = 0;
struct node *d = malloc(num * sizeof(struct node));
char** complete = malloc(num * sizeof(char*));
printf("%s\n", filename);
if( (fp = fopen(filename, "r")) == NULL )
{
printf("unable to open %s\n", filename);
exit(1);
}
while(fgets(buffer, sizeof(buffer), fp) != NULL)
{
if(count == num)
{
num = num + 5;
struct node *d = realloc(d, sizeof(d)*num);
printf("Reallocating\n");
}
token = strtok(buffer, del);
if(strncmp(token, "#", 1) != 0)
{
strcpy(d[count].course, token);
printf("%s\n", d[count].course);
strcpy(d[count].category, strtok(NULL, del));
printf("%s\n", d[count].category);
strcpy(d[count].prereq, strtok(NULL, del));
printf("%s\n", d[count].prereq);
strcpy(d[count].notes, strtok(NULL, del));
printf("%s\n", d[count].notes);
count++;
}
}
在:
struct node *d = realloc(d, sizeof(d)*num);
这声明了一个新变量 d
,其初始值未确定并将其传递给 realloc
。将其更改为:
struct node *tmp = realloc(d, sizeof(*d)*num);
if(!tmp)
; // handle error
d = tmp;
struct node *d = realloc(d, sizeof(d)*num);
您正在声明一个新的 d
变量,它覆盖了前一个变量,并将其尚未初始化的值提供给 realloc
。
您需要这样做:
struct node *newD = realloc(d, num * sizeof *d);
if(!newD) {
// Allocation failure, do something about it and break out
} /* else */
d = newD;
另请注意,我更正了 sizeof
,它测量的是指针的大小,而不是指针的大小。
我正在尝试动态分配结构数组,但每当我 运行 程序时,我都会收到:a.out(6487,0x7fff7ecb8300) malloc: * 对象错误0x7fff6f670000: 重新分配的指针未分配 * 在 malloc_error_break 设置断点调试
struct node {
char course[25];
char category[20];
char prereq[50];
char notes[50];
};
int main(int argc, char* argv[])
{
FILE *fp;
char *filename = argv[1];
char *token;
char buffer[100];
char *del = ",\n";
int num = 5, i = 0, j =0, count = 0;
struct node *d = malloc(num * sizeof(struct node));
char** complete = malloc(num * sizeof(char*));
printf("%s\n", filename);
if( (fp = fopen(filename, "r")) == NULL )
{
printf("unable to open %s\n", filename);
exit(1);
}
while(fgets(buffer, sizeof(buffer), fp) != NULL)
{
if(count == num)
{
num = num + 5;
struct node *d = realloc(d, sizeof(d)*num);
printf("Reallocating\n");
}
token = strtok(buffer, del);
if(strncmp(token, "#", 1) != 0)
{
strcpy(d[count].course, token);
printf("%s\n", d[count].course);
strcpy(d[count].category, strtok(NULL, del));
printf("%s\n", d[count].category);
strcpy(d[count].prereq, strtok(NULL, del));
printf("%s\n", d[count].prereq);
strcpy(d[count].notes, strtok(NULL, del));
printf("%s\n", d[count].notes);
count++;
}
}
在:
struct node *d = realloc(d, sizeof(d)*num);
这声明了一个新变量 d
,其初始值未确定并将其传递给 realloc
。将其更改为:
struct node *tmp = realloc(d, sizeof(*d)*num);
if(!tmp)
; // handle error
d = tmp;
struct node *d = realloc(d, sizeof(d)*num);
您正在声明一个新的 d
变量,它覆盖了前一个变量,并将其尚未初始化的值提供给 realloc
。
您需要这样做:
struct node *newD = realloc(d, num * sizeof *d);
if(!newD) {
// Allocation failure, do something about it and break out
} /* else */
d = newD;
另请注意,我更正了 sizeof
,它测量的是指针的大小,而不是指针的大小。