【问题标题】:Referring to "C - Help understanding how to write a function within a function (list_map)"参考“C - 帮助理解如何在函数中编写函数(list_map)”
【发布时间】:2011-01-08 11:39:57
【问题描述】:

我有同一个教授:我看过论坛:

How to write a function within a function (list_map)

理解函数的概念很有帮助,但我不确定我是否正确使用它......

这是我的代码。如果我在正确的轨道上,请告诉我...

假设我有一个包含 10 个链表的数组,其中链表包含整数

现在我想对调用 list_map() 的列表进行排序;功能

所以我的主要看起来像这样:

int x = 10;  
LLIST *mylist[x];  
bzero(mylist, sizeof(LLIST *)*x);  
.  
.    
for(i=0; i< 10; i++)  
{    
 //Segfalt   
 list_map(mylist[i],sort);   
}

我的 list_map 看起来像:

void list_map( LLIST *list, void (*f)(void *) )  
{  
  printf("Sort");  
  f(list);  
}

和排序:

void sort(LLIST *n) {  
//Sort Code  
}

当我运行它时,我得到的错误是分段错误。

请原谅缺少代码,我知道我的排序功能有效,我已经对其进行了测试,它会打印出每个列表。如果您需要查看更详细的内容,请告诉我,我会提供。

【问题讨论】:

  • 您可以使用调试器或 printfs 来缩小段错误的指令范围吗?这将很快导致对问题的理解
  • 我尝试在调用之前在 for 循环中执行 printf,但它不打印。如果 print f 在循环之前,它将打印。
  • list_map函数中也不做printf
  • 你能编辑你的问题并在你的代码中标记段错误指令吗?我很确定这是一个内存分配错误,但调试练习对你有好处:-)
  • 请注意,'printf()'(通常)会缓冲其输出;您需要使用 'fflush(stdout)' 或 'fprintf(stderr, ...)' 来确保您的诊断打印正确完成。遗憾的是,我们还需要看看两条“点”线代表什么。

标签: c linked-list


【解决方案1】:

bzero 将不分配内存的内存清零,使用 malloc

int x = 10;  
LLIST **mylist;  
mylist = (LLIST**)malloc(sizeof(LLIST *)*x);  
.  
.    
for(i=0; i< 10; i++)  
{    
 //Segfalt   
 list_map(mylist[i],sort);   
}

void list_map( LLIST *list, void (*f)(void *) )  
{  
  printf("Sort");  
  f(list);  
}

【讨论】:

  • bzero 肯定会导致段错误,因为它会将内存中未定义的位置归零
  • 它是否像 bzero 一样实现?我对很多C代码不熟悉
  • ugh LLIST **mylist = (LLIST *)malloc(sizeof(LLIST *)*x).. 抱歉来晚了
  • 我仍然遇到 Seg 错误。。你如何使用调试器?
  • 如果我删除 list_map() 函数,它几乎可以工作......好吧,它没有 Seg 错误
【解决方案2】:

你在分配 mylist 吗?根据您在此处的内容,看起来访问 mylist 的任何内容都会导致段错误。你确定应该是LLIST *mylist[x]; 而不是LLIST mylist[x];

【讨论】:

  • 我忘记添加 bzero(mylist, sizeof(LLIST *)*x);
猜你喜欢
  • 2011-01-08
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多