【问题标题】:To Do List, Reallocation in C待办事项列表,C 中的重新分配
【发布时间】:2015-01-31 01:01:41
【问题描述】:

我正在做计算机 II 的家庭作业。它是在一个动态创建的字符串数组中创建一个待办事项列表,可以通过多种方式进行操作。需要对其进行操作的一种方式是通过添加任务,或者通过使用 realloc 来添加数组元素。我的代码如下,将一直运行,直到我在不同的函数中调用刚刚重新分配的数组。

void add_task(char **List, int line_num){
   char task[1000];

   List = (char**)realloc(List, (line_num+1)*sizeof(char));
   List[line_num] = malloc((1000) * sizeof(char));

   printf("Please enter the string you would like to use as your new task.\n");
   scanf("%s",task);
   strcat(task,"\n");
   strcpy(List[line_num],task);
   return;  
}

【问题讨论】:

  • 在您的消息中添加问号。
  • 您有问题吗?我建议放弃task[1000],您可以将scanf() 直接放入malloc()ed 缓冲区。另外,我会返回新的line_num,因为您可以确定某些调用者会忘记增加他的副本。
  • sizeof(char) 根据定义为 1,因此您不需要在 malloc 中使用它。 OTOH,在realloc 中,您的意思是说sizeof(char *),即绝对不是1 的指针的大小。缺少的* 将使List 缩小4 或8 倍。跨度>
  • 感谢 EOF 的帮助。通过您的更改,我能够自行成功调用数组元素,即 List[line_num]。我在 main 中增加 line_num 以消除返回它的需要。但是,我似乎仍然无法在 for 循环中使用新的数组元素,这可能是因为我在 main 中递增吗?我检查以确保它工作正常并且 line_num 确实增加了,但我不确定。我会在几分钟内发布更多我的代码。

标签: c arrays string realloc


【解决方案1】:

您的realloc() 呼叫有误,您提供的尺寸有误。因为Listchar**,所以元素是char*,而不是char

List = realloc(List, (line_num+1)*sizeof(char*));

由于 sizeof(char*) 很可能是 4,因此您只分配了所需空间的 1/4。然后你在这个数组的范围之外写,导致未定义的行为。

一般来说,当您使用mallocrealloc 分配给<something>* 时,sizeof 的参数应该是<something>,即只需从类型中删除最后一个*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多