将整数转换为另一个char指针

时间:2014-02-09 03:11:20

标签: c pointers

我正在测试下面的代码,但输出只是说

ptr char = (null)

有什么理由发生这种情况?

int buf[1024];
buf[0] = 10;
buf[1] = 0;
buf[2] = 1992;
buf[3] = 42;
buf[4] = 5;
char *ptr;
ptr = (char*)buf+2;
printf("ptr char = %s\n",*ptr);

我刚刚对上面的代码进行了实验,以便我可以逐个了解下面的代码会做什么。 这是我正在处理的代码

int fillNSendHttpReq(int8u seq, char* domain, char* uri, char method, char* contentType, char* otherHeader, int contentLen, char* content, unsigned char timeout, char moreData, char isHttps)

{
int16u encodedLen = moreData?contentLen|0x8000:contentLen; 

//if moredata = true then encodelen = contentlenBITWISEOR0x8000
char *ptr = NULL;
int8u buf[1024];
memset(buf, 0, sizeof(buf));

buf[0] = SNIC_HTTP_REQ;
buf[1] = seq;
*((int16u*)&buf[2]) = 0x5000; //swapped
buf[4] = method;
buf[5] = timeout;



 if (isHttps) {
buf[0] = SNIC_HTTPS_REQ;//SNIC_HTTPS_REQ = 0
*((int16u*)&buf[2]) = 0xbb01; // 443 swapped
 }

ptr = (char*)buf+6; //convert in8u to char * ???
ptr += sprintf(ptr, "%s", domain)+1; //ptr = ptr + strlen(domain)+1
ptr += sprintf(ptr, "%s", uri)+1;
ptr += sprintf(ptr, "%s", contentType)+1;
ptr += sprintf(ptr, "%s", otherHeader)+1;
*((int16u*)ptr) = swap16(encodedLen);
ptr += 2;

if (contentLen) 
    memcpy(ptr, content, contentLen);

serial_transmit(CMD_ID_SNIC, buf, ptr-(char*)buf+contentLen, ACK_NOT_REQUIRED);
return 0;

我不明白的部分是ptr-(char*)buf+contentLen被分配给定义为int的变量,因此让我对我的内容去哪里感到困惑。

2 个答案:

答案 0 :(得分:3)

int 某种尺寸。将2添加到char*时,指针前进两个字节;要按int的大小推进它,你需要(char*)(buf + 2)。超过buf的两个字节可能是buf[1],或者它可能是buf[0]的一半,但显然它指向零,因为这是您通过以后取消引用ptr得到的结果 - { {1}}是NULL。将字符串传递给0时,不要先取消引用它。

但是,我真的不知道如何解决这个问题,因为它没有多大意义。如果您的代码接近您的意图,那么这应该是它应该是:

printf

在这种情况下,它会使用您的示例char *ptr = (char*)(buf + 2); printf("ptr char = %s\n", ptr); 打印零个或一个字符。

答案 1 :(得分:0)

char *ptr;
ptr = (char*)buf+2;
printf("ptr char = %s\n",*ptr);

ptr是一个指针,所以* ptr是它指向的字符。当printf正在等待字符串(char指针)时,你使用一个字符作为参数,因此它崩溃了

以前您已经分配了ptr = (char*)buf+2;buf[0] = 10;,因此无论字节顺序如何,buff中的第三个字节都为零。所以ptr现在指向buff [0]和buff [1]之间,而ptr [0]是0,所以它包含一个空值。这就是你看到输出

的原因

使用此

printf("ptr char = %s\n", ptr);

但是你会看到另一个空输出,因为ptr [0]现在是'\0'。所以除非你清楚地理解它,否则不要使用指针,否则你会看到很多严重的分段错误,而不是像这种情况那么简单