我正在用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字节。感谢所有耐心回答并抱歉浪费时间的人。
答案 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));