获取信号SIGABRT

时间:2016-06-25 10:43:30

标签: c++ c

我'我试图用指针来强调工作。所以我写了一个测试程序,通过删除分隔点将名称拆分成标签。每个标签表示为长度/数据对,如下所示: google.ru代表" x \ 06googlex \ 02ru" 当我从测试功能返回时,我收到信号SIGABRT 我猜这是因为我的指针工作不好造成的。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void test(unsigned char* dns, unsigned char* host);

int main(int argc, const char * argv[])
{

    unsigned char host[]="google.ru";

    unsigned char* dnsTest=(unsigned char*)malloc(20);

    if(dnsTest==NULL)
    {
        exit(1);
    }

    test(dnsTest, host);

    printf("%s", dnsTest);

    free(dnsTest);


    return 0;
}
void test(unsigned char* dns, unsigned char* host)
{
    strcat((char*)host, ".");

    int lock=0;

    for(int i=0; i<strlen((char *)host);i++)
    {
        if(host[i]=='.')
        {

            *dns=i-lock;

            dns++;

            for(;lock<i; lock++)
            {
                *dns=host[lock];
                dns++;

            }
                lock++;
        }
    }
    *dns='\0';

}

1 个答案:

答案 0 :(得分:0)

由于您也标记了c ++,因此您可以使用new \ delete代替malloc \ freeNew会调用构造函数(当你学习类会很有用的时候),而new会返回你的确切类型,所以不需要强制转换(而且强制转换几乎总是一个坏主意)

然后使用new进行内存分配后的断言将是多余的:

if(dnsTest==NULL)

因为c ++ new默认会抛出异常。 如果你继续,你可以使用std::string - 它比c null终止字符串简单得多(但不是理解指针的任务)。

其他所有评论(关于冗余strlen使用和缺少'\0'符号)也是正确的,但我想给你两个建议,如何掌握指针。

首先 - 阅读K&R - 它是圣经。

第二 - 如果您使用Microsoft Visual Studio,则可以在调试模式下编译代码,并使用“内存视图”选项卡。 Visual Studio编译器在调试模式下将一些幻数放在内存(link)中。它们可以帮助您了解解决未分配内存的位置或内存布局的确切位置。