gpt4 book ai didi

c - 尚未运行的函数导致的错误

转载 作者:行者123 更新时间:2023-12-01 21:59:27 26 4
gpt4 key购买 nike

所以我正在编写一个账单处理系统。当前数据位于我编写的 Stack 结构中。

我有这个部分编写的函数可以写出报告:

void GenerateReport(Bill* bill)
{
PrintBillHeading(bill);
//CallEntry* collatedEntries = CollapseCallStack(bill->callEntries);
//TODO
}

只要我将第二行注释掉,它就可以正常工作。如果我取消注释,我会在 PrintBillHeading() 函数中收到 SIGSEGV 错误,如下所示。

void PrintBillHeading(Bill* bill)
{
printf("Big Brother Telecom\n");
printf("Bill Date: %s\n\n",DateTimeToISOString(bill->date));
printf("Contract Holder: %s %s\n", bill->title, bill->name);
printf("Address:\n");
char* addressSeg;
char* addressCpy;
strcpy(addressCpy,bill->address); //This line throws the SIGSEGV
while ((addressSeg = strtok_r(addressCpy,";",&addressCpy)))
{
printf("%s\n\0",addressSeg);
}
}

为了完整起见,这里是我的 CollapseCallStack() 函数,这是不完整的,完全未经测试,可能无法正常工作。

CallEntry* CollapseCallStack(Stack* calls)
{
int size = calls->topIndex;
CallEntry* collatedSet = malloc(sizeof(CallEntry) * size);
CallEntry* poppedCall;
int curIndex = 0;
while (PopStack(calls,poppedCall))
{
bool found = false;
for (int i = 0; i < size; i++)
{
CallEntry* arrItem = collatedSet + i * sizeof(CallEntry);
if (StringEquals(arrItem->phoneNumber,poppedCall->phoneNumber))
{
found = true;
arrItem->minutes += poppedCall->minutes;
}
}
if (!found)
{
memcpy(collatedSet,poppedCall,sizeof(CallEntry)); //
}
}
}

CallEntry 结构:

typedef struct{
char* phoneNumber;
int minutes;
DateTime* callDateTime;
} CallEntry;

我的问题是:一个尚未被调用的函数如何导致 SIGSEGV 错误在程序中更早地表达出来?

一旦我解决了这个问题,我就可以自己调试 CollapseCallStack() 函数,尽管如果有人看到任何明显的问题,我将不胜感激。

最佳答案

在函数 PrintBillHeading() 中,语句 strcpy(addressCpy,bill->address) 使用未初始化变量 addressCpy 的值。这是未定义的行为。未定义的行为意味着程序可能会在任何随机位置崩溃。如果程序包含未定义的行为,整个程序都是无效的

关于c - 尚未运行的函数导致的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54200804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com