我有一个“名称”(字符串)字段的有序结构列表(CASE)。我想创建一个带有参数“name”(字符串)和“count”(整数)的新结构(ARTCOUNT)。
的Structs:
typedef struct
{
char* name;
char* art;
int rating;
}CASE;
typedef struct
{
char* name;
int count;
}ARTCOUNT;
我将使用CASE数组,如果CASE中的“name”与ARTCOUNT中的名称匹配,我将在计数中加1,否则我将使用新名称创建一个新的ARTCOUNT数组并继续遍历数组。 / p>
如果名称匹配,当我尝试添加到计数时,我遇到的问题是一个奇怪的分段错误。
/*all is the array of CASE and pLast points to the last CASE in all*/
void countArt(CASE* all, CASE* pLast)
{
CASE* walker = all;
ARTCOUNT* artAll;
ARTCOUNT* artWalker = artAll;
ARTCOUNT* artLast;
if((artAll = (ARTCOUNT*)malloc(sizeof(ARTCOUNT)*(pLast-all+1))) == NULL)
{
printf("Fatal memory error!\n");
exit(1);
}
artWalker->name = (char*)malloc(sizeof(char)*(100));
strcpy(artWalker->name, walker->name);
artWalker->count = 1;
for(walker = all+1; walker <= pLast; walker++)
{
if (strcmp(walker->name, artWalker->name) == 0)
{
artWalker->count += 1;
}
else
{
artWalker++;
artWalker->name = (char*)malloc(sizeof(char)*(100));
strcpy(artWalker->name, walker->name);
artWalker->count = 1; //if I comment this out, no segmentation fault
}
}
artLast = artWalker;
return;
}
正如上面的代码中所提到的,我设法将可能出错的内容缩小到行artWalker->count-1;
。如果我注释掉这一行,错误就会消失。但是,如果我尝试在循环中打印say artWalker-&gt; name,我仍然会收到分段错误。我已经多次查看了我的内存分配情况,我认为不是这样。
任何提示?
答案 0 :(得分:3)
ARTCOUNT* artAll;
ARTCOUNT* artWalker = artAll;
if((artAll = (ARTCOUNT*)malloc(sizeof(ARTCOUNT)*(pLast-all+1))) == NULL)
{ /* ... */ }
您在artAll
声明后为artWalker
分配内存。这意味着artWalker
初始化为无效值。
答案 1 :(得分:1)
你已宣布
ARTCOUNT* artWalker = artAll;
然后改变了artAll
if((artAll = (ARTCOUNT*)malloc(sizeof(ARTCOUNT)*(pLast-all+1))) == NULL)
此时artWalker指向一个随机内存位置,所以你得到一个分段错误并不奇怪
尝试分配
artWalkr = artAll;
在malloc之后