繁体   English   中英

如果我为结构的指针分配内存,为什么在为结构分配变量时会丢失结构中的数据?

[英]Why is it that I lose data in my struct when allocating variables for my struct if I allocate memory for a pointer of the struct?

所以我有一个包含各种变量的结构。 我的结构是:

struct Task{
    Char* taskName
    arrivalTime
    burstTime
    waitTime
}

我在我的头文件中定义了 struct Task,它包含在我的 C 文件的顶部。 我使用typedef struct Task Task; .

分配内存后:

Task** tasks = malloc(sizeof(Task*)*100);

对于我需要的尽可能多的任务,我分配:

tasks[i] = malloc(sizeof(Task*));
tasks[i]->taskName = malloc(sizeof(char*));

其余变量是非指针,所以我的理解是我不必手动分配内存,即使我使用的是任务**。 我在这里也设置了到达时间和爆发时间。 所有信息都被正确存储。

现在,在我的代码中,我设置了我的结构的 waitTime 变量部分,然后 taskName 就消失了,变成空的或一组奇怪的字符,就像它只包含一段数据一样。 这里发生了什么事?

我是否应该为Task而不是Task*分配空间以避免内存丢失?

您丢失数据是因为数据空间分配不当。 希望这个最小的示例可以让您了解如何处理结构、指针数组和字符串的空间分配。 当然,真正的程序应该在不再需要时释放分配的内存。

/* 
 *      task.c
 * */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAXNTASK 100

typedef struct sTask {
    char* taskName;
    time_t arrivalTime;
    time_t burstTime;
    time_t waitTime;
} Task;


Task* createTask(char* task_name )
{
    Task *task = malloc(sizeof(Task)); /* allocate space for type Task */
    task->taskName = malloc(strlen(task_name)+1); /* make space for task name + string termintor */
    strcpy(task->taskName, task_name);  /* copy string task_name to structure member task->taskName */
    task->arrivalTime = time(NULL);  /* get current time */
    task->burstTime = 0;             /* just initialize burtsTime and waitTime */
    task->waitTime = 0;
    return task; 
}   


int main( int argc, char* argv[])
{
    Task** tasks = malloc(sizeof(Task*) * MAXNTASK);  /* alocate space for array of pointers to type Task */
    char task_name[32];                               /* temporary variable, holds generated name of a task */
    
    for( int i = 0; i < MAXNTASK; i++)                 /* populate array with generated tasks: */
    {
        sprintf(task_name, " Task No. %3.3d", i );     /* generate task name */
        tasks[i] = createTask(task_name);              /* create Tsk and store pointer into array */
    }
        
    for( int i = 0; i < MAXNTASK; i++)                 /* print out tasks */
       printf(" %3.3d %s %s\n", i, tasks[i]->taskName, ctime(&tasks[i]->arrivalTime));  /* function ctime converts time_t to string */
    
    
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM