Per*_*nce 2 c segmentation-fault
所以我正在写一个账单处理系统.数据目前位于Stack我编写的结构中.
我有这个部分编写的函数写出一个报告:
void GenerateReport(Bill* bill)
{
PrintBillHeading(bill);
//CallEntry* collatedEntries = CollapseCallStack(bill->callEntries);
//TODO
}
Run Code Online (Sandbox Code Playgroud)
只要我将第二行注释掉,哪个工作正常.如果我取消注释它,我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);
}
}
Run Code Online (Sandbox Code Playgroud)
为了完整性,这里是我的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)); //
}
}
}
Run Code Online (Sandbox Code Playgroud)
而CallEntry结构:
typedef struct{
char* phoneNumber;
int minutes;
DateTime* callDateTime;
} CallEntry;
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果一个尚未调用的函数如何导致SIGSEGV错误在程序中更早地表达?
一旦我通过了这个,我可以CollapseCallStack()自己调试这个功能,虽然如果有人看到任何明显的问题我会很感激评论.
在函数中PrintBillHeading(),该语句strcpy(addressCpy,bill->address)使用未初始化变量的值addressCpy.这是未定义的行为.未定义的行为意味着程序可能在任何随机位置崩溃.如果程序包含未定义的行为,则整个程序无效.