C初始化其他变量后变量发生变化

时间:2014-11-13 19:48:22

标签: c struct malloc sizeof

我正在用C编写一个命令行待办事项列表程序,并且我得到了一些奇怪的行为。待办事项存储在包含int优先级和char[128]名称的结构中。它们是使用一个函数创建的,该函数接收这些参数并返回带有这些值的已分配和初始化的结构。

返回的结构最初是正确的,但在初始化了8个结构变量之后,第一个初始化结构的值开始变化。我的猜测是,由于没有足够的内存分配,以前的值被新的覆盖。我已经通过将malloc()的{​​{1}}的大小从sizeof(TaskP)增加到sizeof(int) + sizeof(char[128])来暂时解决了这个问题。但是,我确信有一种更好的方法,并且非常赞赏解释为什么malloc(sizeof(TaskP)没有分配足够的内存(如果是这种情况)和适当的约定。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Task {
    char description[128];              /* description of the task */
    int priority;                       /* task priority */
};

typedef  struct Task* Task;


Task createTask (int priority, char *desc)
{
  Task newTask = malloc(sizeof(Task));
  if (newTask) {
    newTask->priority = priority;
    strcpy(newTask->description, desc);
  }
  return newTask;
}

int main(int argc, const char * argv[])
{
    Task taskList[10];

    Task task1 = createTask(9, "task 1");
    printf("task1: %d\n", task1->priority);  /* I put printfs */
    Task task2 = createTask(3, "task 2");
    printf("task1: %d\n", task1->priority);  /* after every call */
    Task task3 = createTask(2, "task 3");
    printf("task1: %d\n", task1->priority);  /* to createTask() */
    Task task4 = createTask(4, "task 4");
    printf("task1: %d\n", task1->priority);  /* to watch the value */
    Task task5 = createTask(5, "task 5");
    printf("task1: %d\n", task1->priority);  /* of task1 change */
    Task task6 = createTask(7, "task 6");
    printf("task1: %d\n", task1->priority);
    Task task7 = createTask(8, "task 7");
    printf("task1: %d\n", task1->priority);
    Task task8 = createTask(6, "task 8");
    printf("task1: %d\n", task1->priority);
    Task task9 = createTask(1, "task 9");
    printf("task1: %d\n", task1->priority);
    Task task10 = createTask(0, "task 10");
    printf("task1: %d\n", task1->priority);

    return 0;
}

这是我的输出:

task1: 9
task1: 9
task1: 9
task1: 9
task1: 9
task1: 9
task1: 9
task1: 0
task1: 1802723700
task1: 1802723700

更新

我在发布到堆栈溢出后几秒钟就找出了问题。多么尴尬。问题是我只为指针(Task)分配了足够的内存,其大小为8字节,而不是struct Task的内存,其大小为132字节。感谢所有耐心回答并抱歉浪费时间的人。

1 个答案:

答案 0 :(得分:3)

这就是问题所在。

Task newTask = malloc(sizeof(Task));

您正在分配足够的内存来仅保留指针,而不是struct Task

将其更改为:

Task newTask = malloc(sizeof(*newTask));

FWIW,将Task作为typedef struct Task*并不是一个好主意。最好使用:

typedef struct Task Task;
typedef struct Task* TaskPtr;

然后使用

Task* newTaskPtr = malloc(sizeof(Task));

TaskPtr newTaskPtr = malloc(sizeof(Task));