2012-04-24 28 views
1

我有一个“名称”(字符串)字段的有序结构列表(CASE)。我想用参数“name”(string)和“count”(integer)创建一个新的结构体(ARTCOUNT)。试图将数据从一个结构复制到另一个结构时出现分段错误

的Structs:

typedef struct 
{ 
    char* name; 
    char* art; 
    int rating; 
}CASE; 

typedef struct 
{ 
    char* name; 
    int count; 
}ARTCOUNT; 

我会走的CASE阵列,如果“名”的情况下,ARTCOUNT相匹配的名字,我会加1计数,否则我将创建一个新的ARTCOUNT阵列新的名字,并继续走阵列。

我遇到的问题是一个奇怪的分段错误,当我尝试添加到计数名称匹配。

/*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;。如果我注释掉这一行,错误消失。但是,如果我尝试在循环中打印artWalker->名称,我仍然会收到分段错误。我检查过我的内存分配几次,我不认为这是。

任何提示?

回答

1

你声明

ARTCOUNT* artWalker = artAll; 

,然后改变artAll

if((artAll = (ARTCOUNT*)malloc(sizeof(ARTCOUNT)*(pLast-all+1))) == NULL) 

在这一点上artWalker指向一个随机的内存位置,所以这并不奇怪,你会得到一个分段错误

尝试分配

artWalkr = artAll; 
malloc之后的210

3
ARTCOUNT* artAll; 
ARTCOUNT* artWalker = artAll; 

if((artAll = (ARTCOUNT*)malloc(sizeof(ARTCOUNT)*(pLast-all+1))) == NULL) 
{ /* ... */ } 

您的artWalker声明后,分配为artAll内存。这意味着artWalker被初始化为无效值。

+0

嗯..我不认为这会影响我分配artWalker。当我为artAll分配内存时,它是否指向artAll分配的数组? – Huy 2012-04-24 16:22:39

+1

@hyngyn不,'artWalker'在'malloc'调用后仍然会有'artAll'的旧无效值 – ouah 2012-04-24 17:38:05

+0

感谢您的帮助! – Huy 2012-04-24 17:43:36

相关问题