我'我试图用指针来强调工作。所以我写了一个测试程序,通过删除分隔点将名称拆分成标签。每个标签表示为长度/数据对,如下所示: 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';
}
答案 0 :(得分:0)
由于您也标记了c ++,因此您可以使用new \ delete
代替malloc \ free
。 New
会调用构造函数(当你学习类会很有用的时候),而new
会返回你的确切类型,所以不需要强制转换(而且强制转换几乎总是一个坏主意)
然后使用new
进行内存分配后的断言将是多余的:
if(dnsTest==NULL)
因为c ++ new
默认会抛出异常。
如果你继续,你可以使用std::string
- 它比c null终止字符串简单得多(但不是理解指针的任务)。
其他所有评论(关于冗余strlen
使用和缺少'\0'
符号)也是正确的,但我想给你两个建议,如何掌握指针。
首先 - 阅读K&R - 它是圣经。
第二 - 如果您使用Microsoft Visual Studio,则可以在调试模式下编译代码,并使用“内存视图”选项卡。 Visual Studio编译器在调试模式下将一些幻数放在内存(link)中。它们可以帮助您了解解决未分配内存的位置或内存布局的确切位置。