由尚未运行的函数引起的错误

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()自己调试这个功能,虽然如果有人看到任何明显的问题我会很感激评论.

Ale*_*exP 6

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

  • @Persistence如果`bill-> address`超过199个字符,这将不起作用...最好使用`strlen(bill-> address)+ 1`来确保你分配足够的空间.或者使用`strdup`在一个函数调用中执行`malloc`和`strcpy` (2认同)