首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C:复制一些结构会导致奇怪的行为。

C:复制一些结构会导致奇怪的行为。
EN

Stack Overflow用户
提问于 2012-08-10 17:51:46
回答 1查看 97关注 0票数 0

我有个烦人的窃听器

代码语言:javascript
运行
复制
rq->tickets[rq->usedContracts] = toAdd;

如果我这么做了:rq->tickets[0] = toAdd程序崩溃

如果我做了rq->tickets[1] = toAdd;,它就能工作

瓦兰说

==19501==使用大小为8的未初始化值

大小为8的==19501==无效写入

就为了这条线。怎么啦?

代码语言:javascript
运行
复制
    struct TS_element {
    int travels;
    int originalTravels;
    int cost;
    char** dates;
    int moneyLeft;
} TicketSet;

struct RQ_element {
    int usedContracts;

    struct TS_element* tickets;
} RabQav;



TicketSetStatus tsCreate(TicketSet* t, int n, int c) {
    if (n <= 0)
    return TS_ILLEGAL_PARAMETER;
    TicketSet* myTicketSet = (TicketSet*) malloc(sizeof(TicketSet));
    if (myTicketSet == NULL) {
        return TS_CANNOT_CREATE;
    }
    myTicketSet->usedTravels = 0;
    myTicketSet->originalTravels = n;
    myTicketSet->cost = c;
    myTicketSet->moneyLeft = n * c;
    char**  dates =  malloc(sizeof(char**)* (n)); //todo maybe c99 allows dynamic arrays?
    for (int i = 0; i < n; i++) {
        dates[i] =  malloc(sizeof(char)*GOOD_LENGTH+1);
        if (dates[i] == NULL) {
            free(dates);  
            free(t);
            return TS_CANNOT_CREATE;
        }
    }


    myTicketSet->dates = dates;
    *t = *myTicketSet;

    return TS_SUCCESS;
}


static void copyTicketSets(TicketSet* dest, const TicketSet* source) {

    dest->usedTravels = source->usedTravels;
    dest->originalTravels = source->originalTravels;
    dest->cost = source->cost;
    dest->moneyLeft = source->moneyLeft;

    for (int i = 0; i < source->originalTravels; i++) {
        if (NULL != source->dates[i]) {
            free(dest->dates[i]);
            dest->dates[i] = malloc(sizeof(char) * GOOD_LENGTH + 1);
            if (dest->dates[i] == NULL) {
                free(dest->dates); //todo free dates 0...i-1
                free(dest);
                return;
            }
            strcpy(dest->dates[i], source->dates[i]);
        }

    }

}
RabQavStatus rqLoadTS(RabQav* rq, TicketSet t, DateTime dt) {


    TicketSet toAdd;
    TicketSetStatus res = tsCreate(&toAdd, t.originalTravels, t.cost);
    if (res != TS_SUCCESS) {
        return RQ_FAIL;
    }

    copyTicketSets(&toAdd, &t);  
    rq->tickets[rq->usedContracts] = toAdd;
    rq->usedContracts++;
    return RQ_SUCCESS;

}
EN

回答 1

Stack Overflow用户

发布于 2012-08-10 18:02:56

以下是一些问题:

代码语言:javascript
运行
复制
TicketSetStatus tsCreate(TicketSet* t, int n, int c) {

如何传递tsCreate a TicketSet*?它会创建一个票证集。因此,指向票证集的指针在条目上是不知道的。

代码语言:javascript
运行
复制
*t = *myTicketSet;

这将t的值设置为myTicketSet的值。但是您希望返回指向新票证集的指针,而不是它的值。

代码语言:javascript
运行
复制
TicketSet toAdd;

当此函数返回时,toAdd超出作用域并被销毁。这不是你想要的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11906799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档